├── .github └── workflows │ └── build-ui-improvements.yaml ├── .gitignore ├── IconicItems ├── IconicItems-PreventDisassembly │ └── r6 │ │ └── scripts │ │ └── IconicItems-PreventDisassembly.reds ├── IconicItems-PreventSelling │ └── r6 │ │ └── scripts │ │ └── IconicItems-PreventSelling.reds ├── IconicItems-ShowWarningDialog │ └── r6 │ │ └── scripts │ │ └── IconicItems-ShowWarningDialog.reds ├── dist │ ├── IconicItems-PreventDisassembly-0.1.11.zip │ ├── IconicItems-PreventSelling-0.2.0.zip │ ├── IconicItems-ShowWarningDialog-0.1.11-r2.zip │ ├── IconicItems-ShowWarningDialog-0.1.11.zip │ ├── IconicItems-ShowWarningDialog-0.2.0.zip │ └── images │ │ ├── iconic-dialog │ │ ├── iconic-dialog.jpg │ │ └── mod-header.jpg │ │ └── iconic-disabled │ │ └── disabled-comparison.jpg └── readme.md ├── UI-Improvements ├── CHANGELOG.md ├── images │ └── DialerMenu │ │ ├── ByName-FOMOD.jpg │ │ └── ByTimestamp-FOMOD.jpg ├── nexus-bbcode.txt ├── r6 │ ├── input │ │ └── flib_ui.xml │ └── scripts │ │ └── flib │ │ ├── DialerMenu-ByName.reds │ │ ├── IconicItems-PreventDisassembly.reds │ │ ├── QuantityPicker-Default.reds │ │ ├── RipperDoc-OnlyCountUnowned.reds │ │ ├── Vendor-FastSell.reds │ │ └── shared │ │ ├── Module.reds │ │ ├── Settings.reds │ │ ├── Sorting.reds │ │ ├── SortingUtils.reds │ │ └── VirtualNestedList.reds ├── readme.md └── wolvenkit │ ├── packed │ └── archive │ │ └── pc │ │ └── mod │ │ ├── ui_improvements.archive │ │ └── ui_improvements.archive.xl │ ├── source │ ├── archive │ │ └── user │ │ │ └── flib │ │ │ └── localization │ │ │ └── ui_improvements.en-us.json │ ├── raw │ │ └── user │ │ │ └── flib │ │ │ └── localization │ │ │ └── ui_improvements.en-us.json.json │ └── resources │ │ └── ui_improvements.archive.xl │ └── ui_improvements.cpmodproj └── readme.md /.github/workflows/build-ui-improvements.yaml: -------------------------------------------------------------------------------- 1 | name: 'Create UI Improvements Release' 2 | on: 3 | workflow_dispatch: 4 | inputs: 5 | version: 6 | description: 'Semantic Version' 7 | required: true 8 | env: 9 | NAME: 'UI Improvements' 10 | VERSION: ${{ github.event.inputs.version }} 11 | BASEPATH: './UI-Improvements/' 12 | ZIPPATHS: 'r6/' 13 | FILENAME: ${{ format('ui-improvements-{0}.zip', github.event.inputs.version) }} 14 | jobs: 15 | build: 16 | name: 'Build & Release' 17 | runs-on: ubuntu-latest 18 | steps: 19 | - name: 'Set ENV vars' 20 | run: echo "FILEPATH=$GITHUB_WORKSPACE/$FILENAME" >> $GITHUB_ENV 21 | 22 | - name: 'Checkout' 23 | uses: actions/checkout@v2 24 | 25 | - name: 'Build artifact' 26 | run: | 27 | cd $BASEPATH 28 | zip -r $FILEPATH $ZIPPATHS 29 | 30 | - name: 'Upload' 31 | uses: actions/upload-artifact@v2 32 | with: 33 | name: ${{ env.FILENAME }} 34 | path: ${{ env.FILEPATH }} 35 | 36 | - name: 'Create Release' 37 | uses: softprops/action-gh-release@v1 38 | with: 39 | draft: true 40 | name: ${{ env.NAME }} ${{ env.VERSION }} 41 | tag_name: ${{ format('v{0}', env.VERSION) }} 42 | files: ${{ env.FILEPATH }} 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cp77-decompiled/ 2 | .references/ 3 | */.working/ 4 | */build/ 5 | 6 | *.psd 7 | *.code-workspace 8 | UI-Improvements/wolvenkit/*.zip 9 | UI-Improvements/wolvenkit/layout.xml 10 | -------------------------------------------------------------------------------- /IconicItems/IconicItems-PreventDisassembly/r6/scripts/IconicItems-PreventDisassembly.reds: -------------------------------------------------------------------------------- 1 | 2 | @replaceMethod(CraftingSystem) 3 | public final const func CanItemBeDisassembled(itemData: wref) -> Bool { 4 | if NotEquals(itemData, null) { 5 | return !itemData.HasTag(n"Quest") 6 | && !itemData.HasTag(n"UnequipBlocked") 7 | && !RPGManager.IsItemIconic(itemData) 8 | && NotEquals(ItemActionsHelper.GetDisassembleAction(itemData.GetID()), null); 9 | }; 10 | return false; 11 | } 12 | -------------------------------------------------------------------------------- /IconicItems/IconicItems-PreventSelling/r6/scripts/IconicItems-PreventSelling.reds: -------------------------------------------------------------------------------- 1 | 2 | @replaceMethod(Vendor) 3 | public final const func PlayerCanSell(itemID: ItemID, allowQuestItems: Bool, excludeEquipped: Bool) -> Bool { 4 | let hasInverseTag: Bool; 5 | let i: Int32; 6 | let inverseFilterTags: array; 7 | let itemData: wref; 8 | let itemTags: array; 9 | let player: wref; 10 | let filterTags: array = this.m_vendorRecord.CustomerFilterTags(); 11 | if allowQuestItems { 12 | ArrayRemove(filterTags, n"Quest"); 13 | }; 14 | inverseFilterTags = TDB.GetCNameArray(this.m_vendorRecord.GetID() + t".customerInverseFilterTags"); 15 | itemTags = RPGManager.GetItemRecord(itemID).Tags(); 16 | player = GetPlayer(this.m_gameInstance); 17 | itemData = GameInstance.GetTransactionSystem(this.m_gameInstance).GetItemData(player, itemID); 18 | // Prevent any sale of iconic items 19 | if RPGManager.IsItemIconic(itemData) { 20 | return false; 21 | } 22 | if excludeEquipped && EquipmentSystem.GetInstance(player).IsEquipped(player, itemID) { 23 | return false; 24 | }; 25 | if ArraySize(inverseFilterTags) > 0 { 26 | i = 0; 27 | while i < ArraySize(inverseFilterTags) { 28 | if itemData.HasTag(inverseFilterTags[i]) { 29 | hasInverseTag = true; 30 | } else { 31 | i += 1; 32 | }; 33 | }; 34 | if !hasInverseTag { 35 | return false; 36 | }; 37 | }; 38 | i = 0; 39 | while i < ArraySize(filterTags) { 40 | if itemData.HasTag(filterTags[i]) { 41 | return false; 42 | }; 43 | i += 1; 44 | }; 45 | return true; 46 | } 47 | -------------------------------------------------------------------------------- /IconicItems/IconicItems-ShowWarningDialog/r6/scripts/IconicItems-ShowWarningDialog.reds: -------------------------------------------------------------------------------- 1 | 2 | @addField(InventoryItemModeLogicController) 3 | private let m_confirmationPopupToken: ref; 4 | 5 | @replaceMethod(InventoryItemModeLogicController) 6 | private final func HandleItemHold(itemData: InventoryItemData, actionName: ref) -> Void { 7 | if actionName.IsAction(n"disassemble_item") && !this.m_isE3Demo && RPGManager.CanItemBeDisassembled(this.m_player.GetGame(), InventoryItemData.GetGameItemData(itemData)) { 8 | if InventoryItemData.GetQuantity(itemData) > 1 { 9 | this.OpenQuantityPicker(itemData, QuantityPickerActionType.Disassembly); 10 | } else { 11 | if RPGManager.IsItemIconic(InventoryItemData.GetGameItemData(itemData)) { 12 | this.ShowIconicConfirmationPopup(itemData); 13 | } else { 14 | ItemActionsHelper.DisassembleItem(this.m_player, InventoryItemData.GetID(itemData)); 15 | this.PlaySound(n"Item", n"OnDisassemble"); 16 | } 17 | }; 18 | } else { 19 | if actionName.IsAction(n"use_item") { 20 | if !InventoryGPRestrictionHelper.CanUse(itemData, this.m_player) { 21 | this.ShowNotification(this.m_player.GetGame(), this.DetermineUIMenuNotificationType()); 22 | return ; 23 | }; 24 | ItemActionsHelper.PerformItemAction(this.m_player, InventoryItemData.GetID(itemData)); 25 | this.m_InventoryManager.MarkToRebuild(); 26 | }; 27 | }; 28 | } 29 | 30 | @addMethod(InventoryItemModeLogicController) 31 | private final func ShowIconicConfirmationPopup(itemData: InventoryItemData) -> Void { 32 | let data = new VendorConfirmationPopupData(); 33 | data.notificationName = n"base\\gameplay\\gui\\widgets\\notifications\\vendor_confirmation.inkwidget"; 34 | data.isBlocking = true; 35 | data.useCursor = true; 36 | data.queueName = n"modal_popup"; 37 | data.itemData = itemData; 38 | data.quantity = InventoryItemData.GetQuantity(itemData); 39 | data.type = VendorConfirmationPopupType.DisassembeIconic; 40 | this.m_confirmationPopupToken = this.m_inventoryController.ShowGameNotification(data); 41 | this.m_confirmationPopupToken.RegisterListener(this, n"OnIconicConfirmationClosed"); 42 | } 43 | 44 | 45 | @addMethod(InventoryItemModeLogicController) 46 | protected cb func OnIconicConfirmationClosed(data: ref) -> Bool { 47 | this.m_confirmationPopupToken = null; 48 | let resultData = (data as VendorConfirmationPopupCloseData); 49 | if resultData.confirm { 50 | ItemActionsHelper.DisassembleItem(this.m_player, InventoryItemData.GetID(resultData.itemData)); 51 | this.PlaySound(n"Item", n"OnDisassemble"); 52 | }; 53 | } 54 | -------------------------------------------------------------------------------- /IconicItems/dist/IconicItems-PreventDisassembly-0.1.11.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/IconicItems/dist/IconicItems-PreventDisassembly-0.1.11.zip -------------------------------------------------------------------------------- /IconicItems/dist/IconicItems-PreventSelling-0.2.0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/IconicItems/dist/IconicItems-PreventSelling-0.2.0.zip -------------------------------------------------------------------------------- /IconicItems/dist/IconicItems-ShowWarningDialog-0.1.11-r2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/IconicItems/dist/IconicItems-ShowWarningDialog-0.1.11-r2.zip -------------------------------------------------------------------------------- /IconicItems/dist/IconicItems-ShowWarningDialog-0.1.11.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/IconicItems/dist/IconicItems-ShowWarningDialog-0.1.11.zip -------------------------------------------------------------------------------- /IconicItems/dist/IconicItems-ShowWarningDialog-0.2.0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/IconicItems/dist/IconicItems-ShowWarningDialog-0.2.0.zip -------------------------------------------------------------------------------- /IconicItems/dist/images/iconic-dialog/iconic-dialog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/IconicItems/dist/images/iconic-dialog/iconic-dialog.jpg -------------------------------------------------------------------------------- /IconicItems/dist/images/iconic-dialog/mod-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/IconicItems/dist/images/iconic-dialog/mod-header.jpg -------------------------------------------------------------------------------- /IconicItems/dist/images/iconic-disabled/disabled-comparison.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/IconicItems/dist/images/iconic-disabled/disabled-comparison.jpg -------------------------------------------------------------------------------- /IconicItems/readme.md: -------------------------------------------------------------------------------- 1 | # Stop Accidentally Disassembling Iconics 2 | 3 | Ever been chopping your loot to bits and accidentally disassembled an iconic weapon? Well no more! 4 | 5 | This mod is available in two variants: 6 | 7 | ### IconicItems-PreventDisassembly 8 | > Completely removes the ability to disassemble iconic items 9 | 10 | ### IconicItems-ShowWarningDialog 11 | > Shows a warning dialog to confirm if you want to disassemble an iconic item.
12 | > _(The dialog existed in the backpack, but not in the inventory, because they're implemented completely separately for some insane reason)_ 13 | 14 | Additionally, I've added another script that can be installed alongside either variant: 15 | 16 | ### IconicItems-PreventSelling 17 | > Completely removes the ability to sell iconic items 18 | 19 | 20 | ## Installation 21 | 22 | Requires the [redscript compiler](https://www.nexusmods.com/cyberpunk2077/mods/1511) to function. Tested with Cyberpunk Patch 1.2 23 | 24 | The zip files are set up to be installed automagically with Vortex or other mod managers, but if you insist on installing it manually then: 25 | - Ensure you have already installed the [redscript compiler](https://www.nexusmods.com/cyberpunk2077/mods/1511) 26 | - Extract the .zip file of your preferred variant to the Cyberpunk game folder so that the script file ends up in the \r6\scripts folder:
27 | `Cyberpunk2077\r6\scripts\IconicItems-{variant}.reds` 28 | 29 | ## IMPORTANT: Redscript v0.2.0 onwards: 30 | 31 | The `IconicItems-ShowWarningDialog` variant has been updated to work with the string escape characters added in redscript v0.2.0, but you will need to edit the exclusions configuration to reenable the script. After installing the latest version of redscript and this mod, edit the configuration file located here:
32 | `Cyberpunk 2077/r6/scripts/redscript.toml` 33 | 34 | and remove the line that says: 35 | ```toml 36 | "IconicItems-ShowWarningDialog", 37 | ``` 38 | 39 | 40 | ## Credits 41 | - jekky for the [redscript compiler](https://github.com/jac3km4/redscript) 42 | - The [CP77 modding discord](https://discord.gg/Epkq79kd96) -------------------------------------------------------------------------------- /UI-Improvements/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [2.0.0] - 2023-XX-XX 4 | 5 | Complete rewrite to support Mod Settings, proper localization and better 6 | compatibility with other mods. 7 | 8 | ### Added 9 | 10 | - Added ArchiveXL as a required dependency for localization support 11 | - Added optional support for Mod Settings 12 | - Added optional support for Input Loader key bindings 13 | 14 | ### Changed 15 | 16 | - Fixed typo bug with Shard sorting by Timestamp 17 | 18 | ## [1.6.0] - 2022-09-14 19 | 20 | Support for Cyberpunk 2077 Patch 1.6 21 | 22 | ### Changed 23 | 24 | Updated Vendor Fast Sell to work with the new vendor logic 25 | - Now supports buyback logic, no money loss going back and forth 26 | - No fast selling of iconic items 27 | 28 | ### Removed 29 | 30 | Removed iconic item sale prevention, CDPR added confirmation dialog 31 | 32 | Removed because they were fixed by CDPR: 33 | - Max ammo crafting 34 | - Vendor quantity picker limits 35 | 36 | ### Unchanged 37 | 38 | - Dialer Menu ordering *(CDPR impl still sorts by hash)* 39 | - Iconic Items - Disassembly prevented 40 | - Quantity Picker - Default to max 41 | - RipperDoc - Only show unowned in UI totals 42 | - Messages/Quests/Shards custom sorting *(CDPR impl still sorts by hash)* 43 | 44 | --- 45 | 46 | ## [1.5.0] - 2022-02-24 47 | 48 | Support for Cyberpunk 2077 Patch 1.5 49 | 50 | ### Added 51 | 52 | - Item Quantity Pickers now default to their max value instead of 1 53 | 54 | ### Changed 55 | 56 | - Requires redscript 0.5 or newer 57 | - Moved shared vendor code up to **shared** folder 58 | 59 | ### Removed 60 | 61 | Removed because they were fixed by CDPR in Patch 1.5 62 | - LMG mod slot fix 63 | - Missing shard group names 64 | - Vehicle quest preview images (albiet fixed poorly) 65 | 66 | --- 67 | 68 | ## [1.3.0] - 2021-09-02 69 | 70 | Support for Cyberpunk 2077 Patch 1.3 71 | 72 | ### Added 73 | 74 | - Vendor - Fast Buy & Sell 75 | - Allows you to sell entire stacks or expensive items without any additional dialogs 76 | - Limits sales to vendor money total 77 | - Also limits all buy/sell actions to player/vendor money total 78 | - Fast Sell is bound to the "Activate Secondary" input event, right click by default 79 | - Button hint text works in English and Russian, currently unsure about other languages 80 | - RPGManager - Mod Slots 81 | - Fixes LMG mods slots 82 | 83 | 84 | ### Changed 85 | 86 | - Requires redscript 0.3 or newer 87 | - Changed all method replacements to wraps where possible 88 | - Reduces issues caused by patch changes 89 | - Should improve compatibility between mods 90 | - Added names to the multiple "Other" shard groups 91 | - Fixed minor issue with phone dialer menu sorting 92 | 93 | ### Removed 94 | 95 | - Quest - Vehicle Previews 96 | - Feature was added by CDPR in Patch 1.3 97 | - Dialer Menu - By Timestamp 98 | - Removed redundant version of phone menu sorting. 99 | - Plan is to reenable this variant when Mod Settings are available 100 | -------------------------------------------------------------------------------- /UI-Improvements/images/DialerMenu/ByName-FOMOD.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/UI-Improvements/images/DialerMenu/ByName-FOMOD.jpg -------------------------------------------------------------------------------- /UI-Improvements/images/DialerMenu/ByTimestamp-FOMOD.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flibdev/cyberpunk-mods/f1d964586c1cc19d4de3163685dc9c390a18ea01/UI-Improvements/images/DialerMenu/ByTimestamp-FOMOD.jpg -------------------------------------------------------------------------------- /UI-Improvements/nexus-bbcode.txt: -------------------------------------------------------------------------------- 1 | [heading][color=#F3E600]flib's UI Improvements[/color][/heading] 2 | A collection of quality-of-life UI improvements to fix minor issues that annoyed me. 3 | 4 | [line] 5 | 6 | [heading][color=#F3E600]Current Improvements[/color][/heading] 7 | [b]Inventory[/b] 8 | [list] 9 | [*]Fixed the weapon mod slots not working on Light Machine Guns 10 | [*]Iconic Items cannot be disassembled 11 | [/list] 12 | [b]Crafting[/b] 13 | [list] 14 | [*]Ammo crafting is limited to the maximum carryable per type 15 | [/list] 16 | [b]Journal[/b] 17 | [list] 18 | [*][color=#F3E600]NEW:[/color] Vehicle quests now have a codex image link to the vehicle being purchased 19 | [*]These three features use the [b][color=#04DAF6]Toggle Comparison Tooltip[/color][/b] keybinding (defaults to Tab) 20 | [*]Sort Quests dynamically by timestamp/name/difficulty 21 | [*]Sort Messages dynamically by timestamp/name 22 | [*]Sort Shards dynamically by timestamp/name 23 | [/list] 24 | [b]Dialer Menu[/b] 25 | [list] 26 | [*]Contacts sorted by name 27 | [*]Always shows contacts that are Quest Related or have unread messages first 28 | [/list] 29 | [b]Shards[/b] 30 | [list] 31 | [*][color=#F3E600]NEW:[/color] Added localized names for the 4 "Other" groups CDPR added 32 | [*]Fixed the name of the Encrypted shards group 33 | [/list] 34 | [b]Vendors[/b] 35 | [list] 36 | [*][color=#F3E600]NEW:[/color] Fast Buy & Sell - Allows you to buy and sell entire items stacks without any additional dialogs 37 | [*] - Uses the [b][color=#04DAF6]Activate Secondary[/color][/b] keybinding (defaults to Right Mouse Button) 38 | [*]Quantity pickers are now limited to the players/vendors total money 39 | [*]Iconic Items cannot be sold 40 | [*]Ripperdoc vendor screen only shows number of unowned mods per body category 41 | [/list] 42 | 43 | [heading][color=#F3E600]Localization Support[/color][/heading] 44 | [list] 45 | [*]The button hint text used by the Journal sorting methods uses existing LocKeys and [b]should[/b] be fully localized 46 | [*]The updated shard group names use existing LocKeys and [b]should[/b] be fully localized 47 | [*]The Fast Buy/Sell button hints use a bit of a hack, but are confirmed to make sense in English and Russian 48 | [/list] 49 | [line] 50 | 51 | [heading][color=#F3E600]Installation[/color][/heading] 52 | This mod requires the latest version of [url=https://www.nexusmods.com/cyberpunk2077/mods/1511]redscript[/url] to be installed. 53 | 54 | To install, simply extract the zip file to your Cyberpunk 2077 installation folder. You should end up with a [b][color=#04DAF6]flib[/color][/b] folder in the [b][color=#04DAF6]Cyberpunk 2077\r6\scripts\[/color][/b] directory 55 | 56 | [heading][color=#F3E600]Uninstallation[/color][/heading] 57 | [list] 58 | [*]Delete the [b][color=#04DAF6]flib[/color][/b] folder from the [b][color=#04DAF6]Cyberpunk 2077\r6\scripts\[/color][/b] directory 59 | [/list] 60 | 61 | [heading][color=#F3E600]Known Incompatibilities[/color][/heading] 62 | This mod is incompatible with a few other mods due to them overriding the same methods 63 | [list] 64 | [*]Incompatible with my [url=https://www.nexusmods.com/cyberpunk2077/mods/2252]Stop Accidentally Disassembling Iconics[/url] mod - this reimplements the same feature 65 | [*]Incompatible with djkovrik's [url=https://www.nexusmods.com/cyberpunk2077/mods/1439]Sorted Menus[/url] mod - our sorting methods are incompatible 66 | [*]Incompatible with djkovrik's [url=https://www.nexusmods.com/cyberpunk2077/mods/2681]No Extra Ammo Crafting[/url] mod - this reimplements the same feature 67 | [/list] 68 | [line] 69 | 70 | [heading][color=#F3E600]Credits[/color][/heading] 71 | [list] 72 | [*][url=https://www.nexusmods.com/cyberpunk2077/users/49982271]jekky[/url] for the [url=https://www.nexusmods.com/cyberpunk2077/mods/1511]redscript compiler[/url] 73 | [*][url=https://www.nexusmods.com/cyberpunk2077/users/100354]djkovrik[/url] for releasing mods implementing the same features but faster 74 | [*]The [url=https://discord.gg/Epkq79kd96]CP77 modding discord[/url] 75 | [/list] 76 | 77 | [heading][color=#F3E600]For Other Redscript Developers[/color][/heading] 78 | A listing of added, wrapped and replaced methods is available on the [url=https://github.com/flibX0r/cyberpunk-mods/tree/main/UI-Improvements]github repo[/url] along with all the source code and my current todo list. 79 | -------------------------------------------------------------------------------- /UI-Improvements/r6/input/flib_ui.xml: -------------------------------------------------------------------------------- 1 | 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 |