مشكلات في استعادة النسخة الاحتياطية إلى discourse

مرحباً بالجميع.

أواجه مشكلة في استعادة نسخة احتياطية إلى خادم discourse الخاص بي. حاولت نشر ملف السجل ولكن لم يُسمح للمستخدمين الجدد بتحميل الملفات، وعندما حاولت نشر الرمز في هذا الموضوع، قيل إنه يتكون من 400 ألف سطر ولا يُسمح إلا بـ 100 ألف سطر. أي مساعدة ستكون موضع تقدير!

إذا لم تتمكن من نشر كل شيء، فستحتاج إلى محاولة تخمين الجزء البارز، ربما في النهاية.

-- execute("WITH remaps AS (\n  SELECT from_icon, to_icon FROM (VALUES ('adjust', 'circle-half-stroke'), ('air-freshener', 'spray-can-sparkles'), ('alien-monster', 'alien-8bit'), ('allergies', 'hand-dots'), ('ambulance', 'truck-medical'), ('american-sign-language-interpreting', 'hands-asl-interpreting'), ('analytics', 'chart-mixed'), ('angle-double-down', 'angles-down'), ('angle-double-left', 'angles-left'), ('angle-double-right', 'angles-right'), ('angle-double-up', 'angles-up'), ('angry', 'face-angry'), ('apple-alt', 'apple-whole'), ('apple-crate', 'crate-apple'), ('archive', 'box-archive'), ('arrow-alt-circle-down', 'circle-down'), ('arrow-alt-circle-left', 'circle-left'), ('arrow-alt-circle-right', 'circle-right'), ('arrow-alt-circle-up', 'circle-up'), ('arrow-alt-down', 'down'), ('arrow-alt-from-bottom', 'up-from-line'), ('arrow-alt-from-left', 'right-from-line'), ('arrow-alt-from-right', 'left-from-line'), ('arrow-alt-from-top', 'down-from-line'), ('arrow-alt-left', 'left'), ('arrow-alt-right', 'right'), ('arrow-alt-square-down', 'square-down'), ('arrow-alt-square-left', 'square-left'), ('arrow-alt-square-right', 'square-right'), ('arrow-alt-square-up', 'square-up'), ('arrow-alt-to-bottom', 'down-to-line'), ('arrow-alt-to-left', 'left-to-line'), ('arrow-alt-to-right', 'right-to-line'), ('arrow-alt-to-top', 'up-to-line'), ('arrow-alt-up', 'up'), ('arrow-circle-down', 'circle-arrow-down'), ('arrow-circle-left', 'circle-arrow-left'), ('arrow-circle-right', 'circle-arrow-right'), ('arrow-circle-up', 'circle-arrow-up'), ('arrow-from-bottom', 'arrow-up-from-line'), ('arrow-from-left', 'arrow-right-from-line'), ('arrow-from-right', 'arrow-left-from-line'), ('arrow-from-top', 'arrow-down-from-line'), ('arrow-square-down', 'square-arrow-down'), ('arrow-square-left', 'square-arrow-left'), ('arrow-square-right', 'square-arrow-right'), ('arrow-square-up', 'square-arrow-up'), ('arrow-to-bottom', 'arrow-down-to-line'), ('arrow-to-left', 'arrow-left-to-line'), ('arrow-to-right', 'arrow-right-to-line'), ('arrow-to-top', 'arrow-up-to-line'), ('arrows', 'arrows-up-down-left-right'), ('arrows-alt', 'up-down-left-right'), ('arrows-alt-h', 'left-right'), ('arrows-alt-v', 'up-down'), ('arrows-h', 'arrows-left-right'), ('arrows-v', 'arrows-up-down'), ('assistive-listening-systems', 'ear-listen'), ('atlas', 'book-atlas'), ('atom-alt', 'atom-simple'), ('backspace', 'delete-left'), ('balance-scale', 'scale-balanced'), ('balance-scale-left', 'scale-unbalanced'), ('balance-scale-right', 'scale-unbalanced-flip'), ('band-aid', 'bandage'), ('barcode-alt', 'rectangle-barcode'), ('baseball-ball', 'baseball'), ('basketball-ball', 'basketball'), ('bed-alt', 'bed-front'), ('beer', 'beer-mug-empty'), ('betamax', 'cassette-betamax'), ('bible', 'book-bible'), ('biking', 'person-biking'), ('biking-mountain', 'person-biking-mountain'), ('birthday-cake', 'cake-candles'), ('blind', 'person-walking-with-cane'), ('book-alt', 'book-blank'), ('book-dead', 'book-skull'), ('book-reader', 'book-open-reader'), ('book-spells', 'book-sparkles'), ('border-style', 'border-top-left'), ('border-style-alt', 'border-bottom-right'), ('box-alt', 'box-taped'), ('box-fragile', 'square-fragile'), ('box-full', 'box-open-full'), ('box-up', 'square-this-way-up'), ('box-usd', 'box-dollar'), ('boxes', 'boxes-stacked'), ('boxes-alt', 'boxes-stacked'), ('brackets', 'brackets-square'), ('broadcast-tower', 'tower-broadcast'), ('burn', 'fire-flame-simple'), ('bus-alt', 'bus-simple'), ('calculator-alt', 'calculator-simple'), ('calendar-alt', 'calendar-days'), ('calendar-edit', 'calendar-pen'), ('calendar-times', 'calendar-xmark'), ('camera-alt', 'camera'), ('camera-home', 'camera-security'), ('car-alt', 'car-rear'), ('car-crash', 'car-burst'), ('car-mechanic', 'car-wrench'), ('caravan-alt', 'caravan-simple'), ('caret-circle-down', 'circle-caret-down'), ('caret-circle-left', 'circle-caret-left'), ('caret-circle-right', 'circle-caret-right'), ('caret-circle-up', 'circle-caret-up'), ('caret-square-down', 'square-caret-down'), ('caret-square-left', 'square-caret-left'), ('caret-square-right', 'square-caret-right'), ('caret-square-up', 'square-caret-up'), ('cctv', 'camera-cctv'), ('chalkboard-teacher', 'chalkboard-user'), ('chart-pie-alt', 'chart-pie-simple'), ('check-circle', 'circle-check'), ('check-square', 'square-check'), ('cheeseburger', 'burger-cheese'), ('chess-bishop-alt', 'chess-bishop-piece'), ('chess-clock-alt', 'chess-clock-flip'), ('chess-king-alt', 'chess-king-piece'), ('chess-knight-alt', 'chess-knight-piece'), ('chess-pawn-alt', 'chess-pawn-piece'), ('chess-queen-alt', 'chess-queen-piece'), ('chess-rook-alt', 'chess-rook-piece'), ('chevron-circle-down', 'circle-chevron-down'), ('chevron-circle-left', 'circle-chevron-left'), ('chevron-circle-right', 'circle-chevron-right'), ('chevron-circle-up', 'circle-chevron-up'), ('chevron-double-down', 'chevrons-down'), ('chevron-double-left', 'chevrons-left'), ('chevron-double-right', 'chevrons-right'), ('chevron-double-up', 'chevrons-up'), ('chevron-square-down', 'square-chevron-down'), ('chevron-square-left', 'square-chevron-left'), ('chevron-square-right', 'square-chevron-right'), ('chevron-square-up', 'square-chevron-up'), ('clinic-medical', 'house-chimney-medical'), ('cloud-download', 'cloud-arrow-down'), ('cloud-download-alt', 'cloud-arrow-down'), ('cloud-upload', 'cloud-arrow-up'), ('cloud-upload-alt', 'cloud-arrow-up'), ('cocktail', 'martini-glass-citrus'), ('coffee', 'mug-saucer'), ('coffee-togo', 'cup-togo'), ('cog', 'gear'), ('cogs', 'gears'), ('columns', 'table-columns'), ('comment-alt', 'message'), ('comment-alt-check', 'message-check'), ('comment-alt-dollar', 'message-dollar'), ('comment-alt-dots', 'message-dots'), ('comment-alt-edit', 'message-pen'), ('comment-alt-exclamation', 'message-exclamation'), ('comment-alt-lines', 'message-lines'), ('comment-alt-medical', 'message-medical'), ('comment-alt-minus', 'message-minus'), ('comment-alt-music', 'message-music'), ('comment-alt-plus', 'message-plus'), ('comment-alt-slash', 'message-slash'), ('comment-alt-smile', 'message-smile'), ('comment-alt-times', 'message-xmark'), ('comment-edit', 'comment-pen'), ('comment-times', 'comment-xmark'), ('comments-alt', 'messages'), ('comments-alt-dollar', 'messages-dollar'), ('compress-alt', 'down-left-and-up-right-to-center'), ('compress-arrows-alt', 'minimize'), ('concierge-bell', 'bell-concierge'), ('construction', 'triangle-person-digging'), ('conveyor-belt-alt', 'conveyor-belt-boxes'), ('cowbell-more', 'cowbell-circle-plus'), ('cricket', 'cricket-bat-ball'), ('crop-alt', 'crop-simple'), ('curling', 'curling-stone'), ('cut', 'scissors'), ('deaf', 'ear-deaf'), ('debug', 'ban-bug'), ('desktop-alt', 'desktop'), ('dewpoint', 'droplet-degree'), ('diagnoses', 'person-dots-from-line'), ('digging', 'person-digging'), ('digital-tachograph', 'tachograph-digital'), ('directions', 'diamond-turn-right'), ('dizzy', 'face-dizzy'), ('dolly-flatbed', 'cart-flatbed'), ('dolly-flatbed-alt', 'cart-flatbed-boxes'), ('dolly-flatbed-empty', 'cart-flatbed-empty'), ('donate', 'circle-dollar-to-slot')" AS mapping(from_icon, to_icon)\n)\nUPDATE badges\nSET icon =\n  CASE\n    WHEN icon LIKE 'fab-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far-%' THEN CONCAT('far-', remaps.to_icon)\n    WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', remaps.to_icon)\n    ELSE remaps.to_icon\n  END\nFROM remaps\nWHERE icon = remaps.from_icon\n  OR icon = CONCAT('fa-', remaps.from_icon)\n  OR icon = CONCAT('far-', remaps.from_icon)\n  OR icon = CONCAT('fab-', remaps.from_icon)\n  OR icon = CONCAT('far fa-', remaps.from_icon)\n  OR icon = CONCAT('fab fa-', remaps.from_icon)\n  OR icon = CONCAT('fas fa-', remaps.from_icon);\n")
   -> 0.0303s
-- execute("UPDATE badges\nSET icon =\nCASE\n  WHEN icon LIKE 'fas fa-%' THEN SUBSTRING(icon FROM 8)\n  WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fa-%' THEN SUBSTRING(icon FROM 4)\n  ELSE icon\nEND\nWHERE icon LIKE 'fa-%'\n  OR icon LIKE 'far fa-%'\n  OR icon LIKE 'fab fa-%'\n  OR icon LIKE 'fas fa-%';\n")
   -> 0.0005s
-- execute("WITH remaps AS (\n  SELECT from_icon, to_icon FROM (VALUES ('adjust', 'circle-half-stroke'), ('air-freshener', 'spray-can-sparkles'), ('alien-monster', 'alien-8bit'), ('allergies', 'hand-dots'), ('ambulance', 'truck-medical'), ('american-sign-language-interpreting', 'hands-asl-interpreting'), ('analytics', 'chart-mixed'), ('angle-double-down', 'angles-down'), ('angle-double-left', 'angles-left'), ('angle-double-right', 'angles-right'), ('angle-double-up', 'angles-up'), ('angry', 'face-angry'), ('apple-alt', 'apple-whole'), ('apple-crate', 'crate-apple'), ('archive', 'box-archive'), ('arrow-alt-circle-down', 'circle-down'), ('arrow-alt-circle-left', 'circle-left'), ('arrow-alt-circle-right', 'circle-right'), ('arrow-alt-circle-up', 'circle-up'), ('arrow-alt-down', 'down'), ('arrow-alt-from-bottom', 'up-from-line'), ('arrow-alt-from-left', 'right-from-line'), ('arrow-alt-from-right', 'left-from-line'), ('arrow-alt-from-top', 'down-from-line'), ('arrow-alt-left', 'left'), ('arrow-alt-right', 'right'), ('arrow-alt-square-down', 'square-down'), ('arrow-alt-square-left', 'square-left'), ('arrow-alt-square-right', 'square-right'), ('arrow-alt-square-up', 'square-up'), ('arrow-alt-to-bottom', 'down-to-line'), ('arrow-alt-to-left', 'left-to-line'), ('arrow-alt-to-right', 'right-to-line'), ('arrow-alt-to-top', 'up-to-line'), ('arrow-alt-up', 'up'), ('arrow-circle-down', 'circle-arrow-down'), ('arrow-circle-left', 'circle-arrow-left'), ('arrow-circle-right', 'circle-arrow-right'), ('arrow-circle-up', 'circle-arrow-up'), ('arrow-from-bottom', 'arrow-up-from-line'), ('arrow-from-left', 'arrow-right-from-line'), ('arrow-from-right', 'arrow-left-from-line'), ('arrow-from-top', 'arrow-down-from-line'), ('arrow-square-down', 'square-arrow-down'), ('arrow-square-left', 'square-arrow-left'), ('arrow-square-right', 'square-arrow-right'), ('arrow-square-up', 'square-arrow-up'), ('arrow-to-bottom', 'arrow-down-to-line'), ('arrow-to-left', 'arrow-left-to-line'), ('arrow-to-right', 'arrow-right-to-line'), ('arrow-to-top', 'arrow-up-to-line'), ('arrows', 'arrows-up-down-left-right'), ('arrows-alt', 'up-down-left-right'), ('arrows-alt-h', 'left-right'), ('arrows-alt-v', 'up-down'), ('arrows-h', 'arrows-left-right'), ('arrows-v', 'arrows-up-down'), ('assistive-listening-systems', 'ear-listen'), ('atlas', 'book-atlas'), ('atom-alt', 'atom-simple'), ('backspace', 'delete-left'), ('balance-scale', 'scale-balanced'), ('balance-scale-left', 'scale-unbalanced'), ('balance-scale-right', 'scale-unbalanced-flip'), ('band-aid', 'bandage'), ('barcode-alt', 'rectangle-barcode'), ('baseball-ball', 'baseball'), ('basketball-ball', 'basketball'), ('bed-alt', 'bed-front'), ('beer', 'beer-mug-empty'), ('betamax', 'cassette-betamax'), ('bible', 'book-bible'), ('biking', 'person-biking'), ('biking-mountain', 'person-biking-mountain'), ('birthday-cake', 'cake-candles'), ('blind', 'person-walking-with-cane'), ('book-alt', 'book-blank'), ('book-dead', 'book-skull'), ('book-reader', 'book-open-reader'), ('book-spells', 'book-sparkles'), ('border-style', 'border-top-left'), ('border-style-alt', 'border-bottom-right'), ('box-alt', 'box-taped'), ('box-fragile', 'square-fragile'), ('box-full', 'box-open-full'), ('box-up', 'square-this-way-up'), ('box-usd', 'box-dollar'), ('boxes', 'boxes-stacked'), ('boxes-alt', 'boxes-stacked'), ('brackets', 'brackets-square'), ('broadcast-tower', 'tower-broadcast'), ('burn', 'fire-flame-simple'), ('bus-alt', 'bus-simple'), ('calculator-alt', 'calculator-simple'), ('calendar-alt', 'calendar-days'), ('calendar-edit', 'calendar-pen'), ('calendar-times', 'calendar-xmark'), ('camera-alt', 'camera'), ('camera-home', 'camera-security'), ('car-alt', 'car-rear'), ('car-crash', 'car-burst'), ('car-mechanic', 'car-wrench'), ('caravan-alt', 'caravan-simple'), ('caret-circle-down', 'circle-caret-down'), ('caret-circle-left', 'circle-caret-left'), ('caret-circle-right', 'circle-caret-right'), ('caret-circle-up', 'circle-caret-up'), ('caret-square-down', 'square-caret-down'), ('caret-square-left', 'square-caret-left'), ('caret-square-right', 'square-caret-right'), ('caret-square-up', 'square-caret-up'), ('cctv', 'camera-cctv'), ('chalkboard-teacher', 'chalkboard-user'), ('chart-pie-alt', 'chart-pie-simple'), ('check-circle', 'circle-check'), ('check-square', 'square-check'), ('cheeseburger', 'burger-cheese'), ('chess-bishop-alt', 'chess-bishop-piece'), ('chess-clock-alt', 'chess-clock-flip'), ('chess-king-alt', 'chess-king-piece'), ('chess-knight-alt', 'chess-knight-piece'), ('chess-pawn-alt', 'chess-pawn-piece'), ('chess-queen-alt', 'chess-queen-piece'), ('chess-rook-alt', 'chess-rook-piece'), ('chevron-circle-down', 'circle-chevron-down'), ('chevron-circle-left', 'circle-chevron-left'), ('chevron-circle-right', 'circle-chevron-right'), ('chevron-circle-up', 'circle-chevron-up'), ('chevron-double-down', 'chevrons-down'), ('chevron-double-left', 'chevrons-left'), ('chevron-double-right', 'chevrons-right'), ('chevron-double-up', 'chevrons-up'), ('chevron-square-down', 'square-chevron-down'), ('chevron-square-left', 'square-chevron-left'), ('chevron-square-right', 'square-chevron-right'), ('chevron-square-up', 'square-chevron-up'), ('clinic-medical', 'house-chimney-medical'), ('cloud-download', 'cloud-arrow-down'), ('cloud-download-alt', 'cloud-arrow-down'), ('cloud-upload', 'cloud-arrow-up'), ('cloud-upload-alt', 'cloud-arrow-up'), ('cocktail', 'martini-glass-citrus'), ('coffee', 'mug-saucer'), ('coffee-togo', 'cup-togo'), ('cog', 'gear'), ('cogs', 'gears'), ('columns', 'table-columns'), ('comment-alt', 'message'), ('comment-alt-check', 'message-check'), ('comment-alt-dollar', 'message-dollar'), ('comment-alt-dots', 'message-dots'), ('comment-alt-edit', 'message-pen'), ('comment-alt-exclamation', 'message-exclamation'), ('comment-alt-lines', 'message-lines'), ('comment-alt-medical', 'message-medical'), ('comment-alt-minus', 'message-minus'), ('comment-alt-music', 'message-music'), ('comment-alt-plus', 'message-plus'), ('comment-alt-slash', 'message-slash'), ('comment-alt-smile', 'message-smile'), ('comment-alt-times', 'message-xmark'), ('comment-edit', 'comment-pen'), ('comment-times', 'comment-xmark'), ('comments-alt', 'messages'), ('comments-alt-dollar', 'messages-dollar'), ('compress-alt', 'down-left-and-up-right-to-center'), ('compress-arrows-alt', 'minimize'), ('concierge-bell', 'bell-concierge'), ('construction', 'triangle-person-digging'), ('conveyor-belt-alt', 'conveyor-belt-boxes'), ('cowbell-more', 'cowbell-circle-plus'), ('cricket', 'cricket-bat-ball'), ('crop-alt', 'crop-simple'), ('curling', 'curling-stone'), ('cut', 'scissors'), ('deaf', 'ear-deaf'), ('debug', 'ban-bug'), ('desktop-alt', 'desktop'), ('dewpoint', 'droplet-degree'), ('diagnoses', 'person-dots-from-line'), ('digging', 'person-digging'), ('digital-tachograph', 'tachograph-digital'), ('directions', 'diamond-turn-right'), ('dizzy', 'face-dizzy'), ('dolly-flatbed', 'cart-flatbed'), ('dolly-flatbed-alt', 'cart-flatbed-boxes'), ('dolly-flatbed-empty', 'cart-flatbed-empty'), ('donate', 'circle-dollar-to-slot')"), ('dot-circle', 'circle-dot'), ('drafting-compass', 'compass-drafting'), ('drone-alt', 'drone-front'), ('dryer-alt', 'dryer-heat'), ('eclipse-alt', 'moon-over-sun'), ('edit', 'pen-to-square'), ('ellipsis-h', 'ellipsis'), ('ellipsis-h-alt', 'ellipsis-stroke'), ('ellipsis-v', 'ellipsis-vertical'), ('ellipsis-v-alt', 'ellipsis-stroke-vertical'), ('envelope-square', 'square-envelope'), ('exchange', 'arrow-right-arrow-left'), ('exchange-alt', 'right-left'), ('exclamation-circle', 'circle-exclamation'), ('exclamation-square', 'square-exclamation'), ('exclamation-triangle', 'triangle-exclamation'), ('expand-alt', 'up-right-and-down-left-from-center'), ('expand-arrows', 'arrows-maximize'), ('expand-arrows-alt', 'maximize'), ('external-link', 'arrow-up-right-from-square'), ('external-link-alt', 'up-right-from-square'), ('external-link-square', 'square-arrow-up-right'), ('external-link-square-alt', 'square-up-right'), ('eyedropper', 'eye-dropper'), ('fast-backward', 'backward-fast'), ('fast-forward', 'forward-fast'), ('feather-alt', 'feather-pointed'), ('female', 'person-dress'), ('field-hockey', 'field-hockey-stick-ball'), ('fighter-jet', 'jet-fighter'), ('file-alt', 'file-lines'), ('file-archive', 'file-zipper'), ('file-chart-line', 'file-chart-column'), ('file-download', 'file-arrow-down'), ('file-edit', 'file-pen'), ('file-medical-alt', 'file-waveform'), ('file-search', 'file-magnifying-glass'), ('file-times', 'file-xmark'), ('file-upload', 'file-arrow-up'), ('film-alt', 'film-simple'), ('fire-alt', 'fire-flame-curved'), ('first-aid', 'kit-medical'), ('fist-raised', 'hand-fist'), ('flag-alt', 'flag-swallowtail'), ('flame', 'fire-flame'), ('flask-poison', 'flask-round-poison'), ('flask-potion', 'flask-round-potion'), ('flushed', 'face-flushed'), ('fog', 'cloud-fog'), ('folder-download', 'folder-arrow-down'), ('folder-times', 'folder-xmark'), ('folder-upload', 'folder-arrow-up'), ('font-awesome-alt', 'square-font-awesome-stroke'), ('font-awesome-flag', 'font-awesome'), ('font-awesome-logo-full', 'font-awesome'), ('football-ball', 'football'), ('fragile', 'wine-glass-crack'), ('frosty-head', 'snowman-head'), ('frown', 'face-frown'), ('frown-open', 'face-frown-open'), ('funnel-dollar', 'filter-circle-dollar'), ('game-board-alt', 'game-board-simple'), ('gamepad-alt', 'gamepad-modern'), ('glass-champagne', 'champagne-glass'), ('glass-cheers', 'champagne-glasses'), ('glass-martini', 'martini-glass-empty'), ('glass-martini-alt', 'martini-glass'), ('glass-whiskey', 'whiskey-glass'), ('glass-whiskey-rocks', 'whiskey-glass-ice'), ('glasses-alt', 'glasses-round'), ('globe-africa', 'earth-africa'), ('globe-americas', 'earth-americas'), ('globe-asia', 'earth-asia'), ('globe-europe', 'earth-europe'), ('golf-ball', 'golf-ball-tee'), ('grimace', 'face-grimace'), ('grin', 'face-grin'), ('grin-alt', 'face-grin-wide'), ('grin-beam', 'face-grin-beam'), ('grin-beam-sweat', 'face-grin-beam-sweat'), ('grin-hearts', 'face-grin-hearts'), ('grin-squint', 'face-grin-squint'), ('grin-squint-tears', 'face-grin-squint-tears'), ('grin-stars', 'face-grin-stars'), ('grin-tears', 'face-grin-tears'), ('grin-tongue', 'face-grin-tongue'), ('grin-tongue-squint', 'face-grin-tongue-squint'), ('grin-tongue-wink', 'face-grin-tongue-wink'), ('grin-wink', 'face-grin-wink'), ('grip-horizontal', 'grip'), ('h-square', 'square-h'), ('hamburger', 'burger'), ('hand-holding-usd', 'hand-holding-dollar'), ('hand-holding-water', 'hand-holding-droplet'), ('hand-paper', 'hand'), ('hand-receiving', 'hands-holding-diamond'), ('hand-rock', 'hand-back-fist'), ('hands-heart', 'hands-holding-heart'), ('hands-helping', 'handshake-angle'), ('hands-usd', 'hands-holding-dollar'), ('hands-wash', 'hands-bubbles'), ('handshake-alt', 'handshake-simple'), ('handshake-alt-slash', 'handshake-simple-slash'), ('hard-hat', 'helmet-safety'), ('hdd', 'hard-drive'), ('head-vr', 'head-side-goggles'), ('headphones-alt', 'headphones-simple'), ('heart-broken', 'heart-crack'), ('heart-circle', 'circle-heart'), ('heart-rate', 'wave-pulse'), ('heart-square', 'square-heart'), ('heartbeat', 'heart-pulse'), ('hiking', 'person-hiking'), ('history', 'clock-rotate-left'), ('home', 'house'), ('home-alt', 'house'), ('home-heart', 'house-heart'), ('home-lg', 'house-chimney'), ('home-lg-alt', 'house'), ('hospital-alt', 'hospital'), ('hospital-symbol', 'circle-h'), ('hot-tub', 'hot-tub-person'), ('hourglass-half', 'hourglass'), ('house-damage', 'house-chimney-crack'), ('house-leave', 'house-person-leave'), ('house-return', 'house-person-return'), ('hryvnia', 'hryvnia-sign'), ('humidity', 'droplet-percent'), ('icons-alt', 'symbols'), ('id-card-alt', 'id-card-clip'), ('industry-alt', 'industry-windows'), ('info-circle', 'circle-info'), ('info-square', 'square-info'), ('innosoft', '42-group'), ('inventory', 'shelves'), ('journal-whills', 'book-journal-whills'), ('kiss', 'face-kiss'), ('kiss-beam', 'face-kiss-beam'), ('kiss-wink-heart', 'face-kiss-wink-heart'), ('landmark-alt', 'landmark-dome'), ('laptop-house', 'house-laptop'), ('laugh', 'face-laugh'), ('laugh-beam', 'face-laugh-beam'), ('laugh-squint', 'face-laugh-squint'), ('laugh-wink', 'face-laugh-wink'), ('level-down', 'arrow-turn-down'), ('level-down-alt', 'turn-down'), ('level-up', 'arrow-turn-up'), ('level-up-alt', 'turn-up'), ('list-alt', 'rectangle-list'), ('location', 'location-crosshairs'), ('location-circle', 'circle-location-arrow'), ('location-slash', 'location-crosshairs-slash'), ('lock-alt', 'lock-keyhole'), ('lock-open-alt', 'lock-keyhole-open'), ('long-arrow-alt-down', 'down-long'), ('long-arrow-alt-left', 'left-long'), ('long-arrow-alt-right', 'right-long'), ('long-arrow-alt-up', 'up-long'), ('long-arrow-down', 'arrow-down-long'), ('long-arrow-left', 'arrow-left-long'), ('long-arrow-right', 'arrow-right-long'), ('long-arrow-up', 'arrow-up-long'), ('low-vision', 'eye-low-vision'), ('luchador', 'luchador-mask'), ('luggage-cart', 'cart-flatbed-suitcase'), ('magic', 'wand-magic'), ('mail-bulk', 'envelopes-bulk'), ('male', 'person'), ('map-marked', 'map-location'), ('map-marked-alt', 'map-location-dot'), ('map-marker', 'location-pin'), ('map-marker-alt', 'location-dot'), ('map-marker-alt-slash', 'location-dot-slash'), ('map-marker-check', 'location-check'), ('map-marker-edit', 'location-pen'), ('map-marker-exclamation', 'location-exclamation'), ('map-marker-minus', 'location-minus'), ('map-marker-plus', 'location-plus'), ('map-marker-question', 'location-question'), ('map-marker-slash', 'location-pin-slash'), ('map-marker-smile', 'location-smile'), ('map-marker-times', 'location-xmark'), ('map-signs', 'signs-post'), ('mars-stroke-h', 'mars-stroke-right'), ('mars-stroke-v', 'mars-stroke-up'), ('medium-m', 'medium'), ('medkit', 'suitcase-medical'), ('meh', 'face-meh'), ('meh-blank', 'face-meh-blank'), ('meh-rolling-eyes', 'face-rolling-eyes'), ('microphone-alt', 'microphone-lines'), ('microphone-alt-slash', 'microphone-lines-slash'), ('mind-share', 'brain-arrow-curved-right'), ('minus-circle', 'circle-minus'), ('minus-hexagon', 'hexagon-minus'), ('minus-octagon', 'octagon-minus'), ('minus-square', 'square-minus'), ('mobile-alt', 'mobile-screen-button'), ('mobile-android', 'mobile'), ('mobile-android-alt', 'mobile-screen'), ('money-bill-alt', 'money-bill-1'), ('money-bill-wave-alt', 'money-bill-1-wave'), ('money-check-alt', 'money-check-dollar'), ('money-check-edit', 'money-check-pen'), ('money-check-edit-alt', 'money-check-dollar-pen'), ('monitor-heart-rate', 'monitor-waveform'), ('mouse', 'computer-mouse'), ('mouse-alt', 'computer-mouse-scrollwheel'), ('mouse-pointer', 'arrow-pointer'), ('music-alt', 'music-note'), ('music-alt-slash', 'music-note-slash'), ('oil-temp', 'oil-temperature'), ('page-break', 'file-dashed-line'), ('paint-brush', 'paintbrush'), ('paint-brush-alt', 'paintbrush-fine'), ('paint-brush-fine', 'paintbrush-fine'), ('pallet-alt', 'pallet-boxes'), ('paragraph-rtl', 'paragraph-left'), ('parking', 'square-parking'), ('parking-circle', 'circle-parking'), ('parking-circle-slash', 'ban-parking'), ('parking-slash', 'square-parking-slash'), ('pastafarianism', 'spaghetti-monster-flying'), ('pause-circle', 'circle-pause'), ('paw-alt', 'paw-simple'), ('pen-alt', 'pen-clip'), ('pen-square', 'square-pen'), ('pencil-alt', 'pencil'), ('pencil-paintbrush', 'pen-paintbrush'), ('pencil-ruler', 'pen-ruler'), ('pennant', 'flag-pennant'), ('people-arrows', 'people-arrows-left-right'), ('people-carry', 'people-carry-box'), ('percentage', 'percent'), ('person-carry', 'person-carry-box'), ('phone-alt', 'phone-flip'), ('phone-laptop', 'laptop-mobile'), ('phone-square', 'square-phone'), ('phone-square-alt', 'square-phone-flip'), ('photo-video', 'photo-film'), ('plane-alt', 'plane-engines'), ('play-circle', 'circle-play'), ('plus-circle', 'circle-plus'), ('plus-hexagon', 'hexagon-plus'), ('plus-octagon', 'octagon-plus'), ('plus-square', 'square-plus'), ('poll', 'square-poll-vertical'), ('poll-h', 'square-poll-horizontal'), ('portal-enter', 'person-to-portal'), ('portal-exit', 'person-from-portal'), ('portrait', 'image-portrait'), ('pound-sign', 'sterling-sign'), ('pray', 'person-praying'), ('praying-hands', 'hands-praying'), ('prescription-bottle-alt', 'prescription-bottle-medical'), ('presentation', 'presentation-screen'), ('print-search', 'print-magnifying-glass'), ('procedures', 'bed-pulse'), ('project-diagram', 'diagram-project'), ('question-circle', 'circle-question'), ('question-square', 'square-question'), ('quran', 'book-quran'), ('rabbit-fast', 'rabbit-running'), ('radiation-alt', 'circle-radiation'), ('radio-alt', 'radio-tuner'), ('random', 'shuffle'), ('rectangle-landscape', 'rectangle'), ('rectangle-portrait', 'rectangle-vertical'), ('redo', 'arrow-rotate-right'), ('redo-alt', 'rotate-right'), ('remove-format', 'text-slash'), ('repeat-1-alt', 'arrows-repeat-1'), ('repeat-alt', 'arrows-repeat'), ('retweet-alt', 'arrows-retweet'), ('rss-square', 'square-rss'), ('running', 'person-running'), ('sad-cry', 'face-sad-cry'), ('sad-tear', 'face-sad-tear'), ('save', 'floppy-disk'), ('sax-hot', 'saxophone-fire'), ('scalpel-path', 'scalpel-line-dashed'), ('scanner-image', 'scanner'), ('search', 'magnifying-glass'), ('search-dollar', 'magnifying-glass-dollar'), ('search-location', 'magnifying-glass-location'), ('search-minus', 'magnifying-glass-minus'), ('search-plus', 'magnifying-glass-plus'), ('sensor-alert', 'sensor-triangle-exclamation'), ('sensor-smoke', 'sensor-cloud'), ('share-alt', 'share-nodes'), ('share-alt-square', 'square-share-nodes'), ('share-square', 'share-from-square'), ('shield-alt', 'shield-halved'), ('shipping-fast', 'truck-fast'), ('shipping-timed', 'truck-clock'), ('shopping-bag', 'bag-shopping'), ('shopping-basket', 'basket-shopping'), ('shopping-cart', 'cart-shopping'), ('shuttle-van', 'van-shuttle'), ('sign', 'sign-hanging'), ('sign-in', 'arrow-right-to-bracket'), ('sign-in-alt', 'right-to-bracket'), ('sign-language', 'hands'), ('sign-out', 'arrow-right-from-bracket'), ('sign-out-alt', 'right-from-bracket'), ('signal-1', 'signal-weak'), ('signal-2', 'signal-fair'), ('signal-3', 'signal-good'), ('signal-4', 'signal-strong'), ('signal-alt', 'signal-bars'), ('signal-alt-1', 'signal-bars-weak'), ('signal-alt-2', 'signal-bars-fair'), ('signal-alt-3', 'signal-bars-good'), ('signal-alt-slash', 'signal-bars-slash'), ('skating', 'person-skating'), ('ski-jump', 'person-ski-jumping'), ('ski-lift', 'person-ski-lift'), ('skiing', 'person-skiing'), ('skiing-nordic', 'person-skiing-nordic'), ('slack-hash', 'slack'), ('sledding', 'person-sledding'), ('sliders-h', 'sliders'), ('sliders-h-square', 'square-sliders'), ('sliders-v', 'sliders-up'), ('sliders-v-square', 'square-sliders-vertical'), ('smile', 'face-smile'), ('smile-beam', 'face-smile-beam'), ('smile-plus', 'face-smile-plus'), ('smile-wink', 'face-smile-wink'), ('smoking-ban', 'ban-smoking'), ('sms', 'comment-sms'), ('snapchat-ghost', 'snapchat'), ('snowboarding', 'person-snowboarding'), ('snowmobile', 'person-snowmobiling'), ('sort-alpha-down', 'arrow-down-a-z'), ('sort-alpha-down-alt', 'arrow-down-z-a'), ('sort-alpha-up', 'arrow-up-a-z'), ('sort-alpha-up-alt', 'arrow-up-z-a'), ('sort-alt', 'arrow-down-arrow-up'), ('sort-amount-down', 'arrow-down-wide-short'), ('sort-amount-down-alt', 'arrow-down-short-wide'), ('sort-amount-up', 'arrow-up-wide-short'), ('sort-amount-up-alt', 'arrow-up-short-wide'), ('sort-circle', 'circle-sort'), ('sort-circle-down', 'circle-sort-down'), ('sort-circle-up', 'circle-sort-up'), ('sort-numeric-down', 'arrow-down-1-9'), ('sort-numeric-down-alt', 'arrow-down-9-1'), ('sort-numeric-up', 'arrow-up-1-9'), ('sort-numeric-up-alt', 'arrow-up-9-1'), ('sort-shapes-down', 'arrow-down-triangle-square'), ('sort-shapes-down-alt', 'arrow-down-square-triangle'), ('sort-shapes-up', 'arrow-up-triangle-square'), ('sort-shapes-up-alt', 'arrow-up-square-triangle'), ('sort-size-down', 'arrow-down-big-small'), ('sort-size-down-alt', 'arrow-down-small-big'), ('sort-size-up', 'arrow-up-big-small'), ('sort-size-up-alt', 'arrow-up-small-big'), ('soup', 'bowl-hot'), ('space-shuttle', 'shuttle-space'), ('space-station-moon-alt', 'space-station-moon-construction'), ('square-root-alt', 'square-root-variable'), ('star-half-alt', 'star-half-stroke'), ('starfighter-alt', 'starfighter-twin-ion-engine'), ('step-backward', 'backward-step'), ('step-forward', 'forward-step'), ('sticky-note', 'note-sticky'), ('stop-circle', 'circle-stop'), ('store-alt', 'shop'), ('store-alt-slash', 'shop-slash'), ('stream', 'bars-staggered'), ('subway', 'train-subway'), ('surprise', 'face-surprise'), ('swimmer', 'person-swimming'), ('swimming-pool', 'water-ladder'), ('sync', 'arrows-rotate'), ('sync-alt', 'rotate'), ('table-tennis', 'table-tennis-paddle-ball'), ('tablet-alt', 'tablet-screen-button'), ('tablet-android', 'tablet'), ('tablet-android-alt', 'tablet-screen'), ('tachometer', 'gauge-simple'), ('tachometer-alt', 'gauge'), ('tachometer-alt-average', 'gauge-med'), ('tachometer-alt-fast', 'gauge'), ('tachometer-alt-fastest', 'gauge-max'), ('tachometer-alt-slow', 'gauge-low'), ('tachometer-alt-slowest', 'gauge-min'), ('tachometer-average', 'gauge-simple-med'), ('tachometer-fast', 'gauge-simple'), ('tachometer-fastest', 'gauge-simple-max'), ('tachometer-slow', 'gauge-simple-low'), ('tachometer-slowest', 'gauge-simple-min'), ('tanakh', 'book-tanakh'), ('tasks', 'list-check'), ('tasks-alt', 'bars-progress'), ('telegram-plane', 'telegram'), ('temperature-down', 'temperature-arrow-down'), ('temperature-frigid', 'temperature-snow'), ('temperature-hot', 'temperature-sun'), ('temperature-up', 'temperature-arrow-up'), ('tenge', 'tenge-sign'), ('th', 'table-cells'), ('th-large', 'table-cells-large'), ('th-list', 'table-list'), ('theater-masks', 'masks-theater'), ('thermometer-empty', 'temperature-empty'), ('thermometer-full', 'temperature-full'), ('thermometer-half', 'temperature-half'), ('thermometer-quarter', 'temperature-quarter'), ('thermometer-three-quarters', 'temperature-three-quarters'), ('thumb-tack', 'thumbtack'), ('thunderstorm', 'cloud-bolt'), ('thunderstorm-moon', 'cloud-bolt-moon'), ('thunderstorm-sun', 'cloud-bolt-sun'), ('ticket-alt', 'ticket-simple'), ('times', 'xmark'), ('times-circle', 'circle-xmark'), ('times-hexagon', 'hexagon-xmark'), ('times-octagon', 'octagon-xmark'), ('times-square', 'square-xmark'), ('tint', 'droplet'), ('tint-slash', 'droplet-slash'), ('tired', 'face-tired'), ('toilet-paper-alt', 'toilet-paper-blank'), ('tombstone-alt', 'tombstone-blank'), ('tools', 'screwdriver-wrench'), ('torah', 'scroll-torah'), ('tram', 'train-tram'), ('transgender-alt', 'transgender'), ('trash-alt', 'trash-can'), ('trash-restore', 'trash-arrow-up'), ('trash-restore-alt', 'trash-can-arrow-up'), ('trash-undo-alt', 'trash-can-undo'), ('tree-alt', 'tree-deciduous'), ('triangle-music', 'triangle-instrument'), ('trophy-alt', 'trophy-star'), ('truck-couch', 'truck-ramp-couch'), ('truck-loading', 'truck-ramp-box'), ('tshirt', 'shirt'), ('tv-alt', 'tv'), ('undo', 'arrow-rotate-left'), ('undo-alt', 'rotate-left'), ('university', 'building-columns'), ('unlink', 'link-slash'), ('unlock-alt', 'unlock-keyhole'), ('usd-circle', 'circle-dollar'), ('usd-square', 'square-dollar'), ('user-alt', 'user-large'), ('user-alt-slash', 'user-large-slash'), ('user-chart', 'chart-user'), ('user-circle', 'circle-user'), ('user-cog', 'user-gear'), ('user-edit', 'user-pen'), ('user-friends', 'user-group'), ('user-hard-hat', 'user-helmet-safety'), ('user-md', 'user-doctor'), ('user-md-chat', 'user-doctor-message'), ('user-times', 'user-xmark'), ('users-class', 'screen-users'), ('users-cog', 'users-gear'), ('users-crown', 'user-group-crown'), ('utensil-fork', 'fork'), ('utensil-knife', 'knife'), ('utensil-spoon', 'spoon'), ('utensils-alt', 'fork-knife'), ('vhs', 'cassette-vhs'), ('volleyball-ball', 'volleyball'), ('volume-down', 'volume-low'), ('volume-mute', 'volume-xmark'), ('volume-up', 'volume-high'), ('vote-nay', 'xmark-to-slot'), ('vote-yea', 'check-to-slot'), ('walking', 'person-walking'), ('warehouse-alt', 'warehouse-full'), ('washer', 'washing-machine'), ('water-lower', 'water-arrow-down'), ('water-rise', 'water-arrow-up'), ('waveform-path', 'waveform-lines'), ('webcam', 'camera-web'), ('webcam-slash', 'camera-web-slash'), ('weight', 'weight-scale'), ('wifi-1', 'wifi-weak'), ('wifi-2', 'wifi-fair'), ('window-alt', 'window-flip'), ('window-close', 'rectangle-xmark'), ('wine-glass-alt', 'wine-glass-empty')) AS mapping(from_icon, to_icon)\n)\nUPDATE directory_columns\nSET icon =\n  CASE\n    WHEN icon LIKE 'fab-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far-%' THEN CONCAT('far-', remaps.to_icon)\n    WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', remaps.to_icon)\n    ELSE remaps.to_icon\n  END\nFROM remaps\nWHERE icon = remaps.from_icon\n  OR icon = CONCAT('fa-', remaps.from_icon)\n  OR icon = CONCAT('far-', remaps.from_icon)\n  OR icon = CONCAT('fab-', remaps.from_icon)\n  OR icon = CONCAT('far fa-', remaps.from_icon)\n  OR icon = CONCAT('fab fa-', remaps.from_icon)\n  OR icon = CONCAT('fas fa-', remaps.from_icon);\n")
   -> 0.0055 ثانية
-- execute("UPDATE directory_columns\nSET icon =\nCASE\n  WHEN icon LIKE 'fas fa-%' THEN SUBSTRING(icon FROM 8)\n  WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fa-%' THEN SUBSTRING(icon FROM 4)\n  ELSE icon\nEND\nWHERE icon LIKE 'fa-%'\n  OR icon LIKE 'far fa-%'\n  OR icon LIKE 'fab fa-%'\n  OR icon LIKE 'fas fa-%';\n")
   -> 0.0003 ثانية
== 20241204085540 RemapToFa6IconNames: تم الترحيل (0.0600 ثانية) =====================

== 20241205035402 ChangeDefaultForBadgesIcon: جارٍ الترحيل =======================
-- change_column_default(:badges, :icon, {:from=>"fa-certificate", :to=>"certificate"})
   -> 0.0023 ثانية
-- execute("UPDATE badges\nSET icon = 'certificate'\nWHERE icon = 'fa-certificate';\n")
   -> 0.0003 ثانية
== 20241205035402 ChangeDefaultForBadgesIcon: تم الترحيل (0.0032 ثانية) ==============

== 20241205162117 AddColumnsToMovedPosts: جارٍ الترحيل ===========================
-- add_column(:moved_posts, :old_topic_title, :string)
   -> 0.0010 ثانية
-- add_column(:moved_posts, :post_user_id, :integer)
   -> 0.0003 ثانية
-- add_column(:moved_posts, :user_id, :integer)
   -> 0.0002 ثانية
-- add_index(:moved_posts, [:new_topic_id, :post_user_id])
   -> 0.0031 ثانية
== 20241205162117 AddColumnsToMovedPosts: تم الترحيل (0.0052 ثانية) ==================

== 20241206002425 DropExperimentalTopicsFilterSiteSetting: جارٍ الترحيل ==========
-- execute("DELETE FROM site_settings\nWHERE name = 'experimental_topics_filter'\n")
   -> 0.0002 ثانية
== 20241206002425 DropExperimentalTopicsFilterSiteSetting: تم الترحيل (0.0006 ثانية) =

== 20241206121401 DeleteCategoriesOnlyOptimizedSiteSetting: جارٍ الترحيل =========
-- execute("DELETE FROM site_settings WHERE name = 'desktop_category_page_style' AND value = 'categories_only_optimized'")
   -> 0.0002 ثانية
== 20241206121401 DeleteCategoriesOnlyOptimizedSiteSetting: تم الترحيل (0.0005 ثانية) 

== 20241211030039 RemoveGlimmerPostMenuGroupsSetting: جارٍ الترحيل ===============
-- execute("DELETE FROM site_settings\nWHERE name = 'glimmer_post_menu_groups'\n")
   -> 0.0002 ثانية
== 20241211030039 RemoveGlimmerPostMenuGroupsSetting: تم الترحيل (0.0005 ثانية) ======

== 20241211222608 AddFullMoveToMovedPostRecords: جارٍ الترحيل ====================
-- add_column(:moved_posts, :full_move, :boolean)
   -> 0.0003 ثانية
== 20241211222608 AddFullMoveToMovedPostRecords: تم الترحيل (0.0007 ثانية) ===========

== 20241224191732 ChangeFullNameRequiredSetting: جارٍ الترحيل ====================
== 20241224191732 ChangeFullNameRequiredSetting: تم الترحيل (0.0012 ثانية) ===========

== 20241226162229 AddChatSendShortcutPreference: جارٍ الترحيل ====================
-- add_column(:user_options, :chat_send_shortcut, :integer, {:default=>0, :null=>false})
   -> 0.0007 ثانية
== 20241226162229 AddChatSendShortcutPreference: تم الترحيل (0.0011 ثانية) ===========

== 20250115031117 RemoveUserProfileFromOverriddenRobots: جارٍ الترحيل ============
-- select_value("SELECT value FROM site_settings WHERE name = 'overridden_robots_txt' AND value LIKE '%User-agent: *\nDisallow: /admin/\nDisallow: /auth/\nDisallow: /assets/browser-update*.js\nDisallow: /email/\nDisallow: /session\nDisallow: /user-api-key\nDisallow: /*?api_key*\nDisallow: /*?*api_key*\nDisallow: /badges\nDisallow: /u/%'")
   -> 0.0002 ثانية
== 20250115031117 RemoveUserProfileFromOverriddenRobots: تم الترحيل (0.0006 ثانية) ===

== 20250116024516 UpdateFontSiteSettingsType: جارٍ الترحيل =======================
-- execute("UPDATE site_settings SET data_type=8 WHERE name IN('base_font', 'heading_font')")
   -> 0.0002 ثانية
== 20250116024516 UpdateFontSiteSettingsType: تم الترحيل (0.0005 ثانية) ==============

== 20250117065027 SetDefaultFontForExistingSites: جارٍ الترحيل ===================
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('base_font', 8, 'arial', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0002 ثانية
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('heading_font', 8, 'arial', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0002 ثانية
== 20250117065027 SetDefaultFontForExistingSites: تم الترحيل (0.0029 ثانية) ==========

== 20250119222805 FillFastTypingThresholdBasedOnDeprecatedSetting: جارٍ الترحيل ==
== 20250119222805 FillFastTypingThresholdBasedOnDeprecatedSetting: تم الترحيل (0.0005 ثانية) 

== 20250120115539 AddDarkHexToColorSchemeColor: جارٍ الترحيل =====================
-- add_column(:color_scheme_colors, :dark_hex, :string, {:limit=>6})
   -> 0.0004 ثانية
== 20250120115539 AddDarkHexToColorSchemeColor: تم الترحيل (0.0007 ثانية) ============

== 20250121180125 CreateThemeColorScheme: جارٍ الترحيل ===========================
-- create_table(:theme_color_schemes)
   -> 0.0039 ثانية
-- add_index(:theme_color_schemes, :theme_id, {:unique=>true})
   -> 0.0027 ثانية
-- add_index(:theme_color_schemes, :color_scheme_id, {:unique=>true})
   -> 0.0029 ثانية
== 20250121180125 CreateThemeColorScheme: تم الترحيل (0.0100 ثانية) ==================

== 20250124062108 RemapDeprecatedIconNamesForSeededBadges: جارٍ الترحيل ==========
-- execute("WITH remaps AS (\n  SELECT from_icon, to_icon\n  FROM (VALUES ('smile', 'face-smile'), ('share-alt', 'share-nodes'))\n  AS mapping(from_icon, to_icon)\n)\nUPDATE badges\nSET icon = remaps.to_icon\nFROM remaps\nWHERE icon = remaps.from_icon;\n")
   -> 0.0005 ثانية
== 20250124062108 RemapDeprecatedIconNamesForSeededBadges: تم الترحيل (0.0009 ثانية) =

== 20250130205841 FixIncorrectFastTypingThresholdSetting: جارٍ الترحيل ===========
-- execute("UPDATE site_settings SET value = 'disabled' WHERE name = 'fast_typing_threshold' AND value = 'off'")
   -> 0.0002 ثانية
== 20250130205841 FixIncorrectFastTypingThresholdSetting: تم الترحيل (0.0005 ثانية) ==

== 20250205174221 AddSerializeTopicOpLikesDataThemeModifier: جارٍ الترحيل ========
-- add_column(:theme_modifier_sets, :serialize_topic_op_likes_data, :boolean, {:null=>true})
   -> 0.0004 ثانية
== 20250205174221 AddSerializeTopicOpLikesDataThemeModifier: تم الترحيل (0.0007 ثانية) 

== 20250212044021 RenameAllowAllUsersToFlagIllegalContentSiteSetting: جارٍ الترحيل 
-- execute("UPDATE site_settings SET name = 'allow_all_users_to_flag_illegal_content' where name = 'allow_tl0_and_anonymous_users_to_flag_illegal_content'")
   -> 0.0002 ثانية
== 20250212044021 RenameAllowAllUsersToFlagIllegalContentSiteSetting: تم الترحيل (0.0005 ثانية) 

== 20250212045125 AddTypeSourceToReviewable: جارٍ الترحيل ========================
-- add_column(:reviewables, :type_source, :string, {:null=>false, :default=>"unknown"})
   -> 0.0006 ثانية
== 20250212045125 AddTypeSourceToReviewable: تم الترحيل (0.0023 ثانية) ===============

== 20250217003916 XSummaryLargeImageBasedOnDeprecatedSetting: جارٍ الترحيل =======
== 20250217003916 XSummaryLargeImageBasedOnDeprecatedSetting: تم الترحيل (0.0007 ثانية) 

== 20250220045740 AddContextToReviewableScores: جارٍ الترحيل =====================
-- add_column(:reviewable_scores, :context, :string)
   -> 0.0004 ثانية
== 20250220045740 AddContextToReviewableScores: تم الترحيل (0.0007 ثانية) ============

== 20250220090521 AddLastUnreadMessageWhenEmailedIdToChatThreadMemberships: جارٍ الترحيل 
-- add_column(:user_chat_thread_memberships, :last_unread_message_when_emailed_id, :bigint)
   -> 0.0003 ثانية
== 20250220090521 AddLastUnreadMessageWhenEmailedIdToChatThreadMemberships: تم الترحيل (0.0006 ثانية) 

== 20250227142351 MigrateSidekiqJobs: جارٍ الترحيل ===============================
== 20250227142351 MigrateSidekiqJobs: تم الترحيل (0.0025 ثانية) ======================

== 20250304034313 AddComposerColumnsToPostStat: جارٍ الترحيل =====================
-- add_column(:post_stats, :composer_version, :integer)
   -> 0.0004 ثانية
-- add_column(:post_stats, :writing_device, :string)
   -> 0.0032 ثانية
-- add_column(:post_stats, :writing_device_user_agent, :string)
   -> 0.0003 ثانية
== 20250304034313 AddComposerColumnsToPostStat: تم الترحيل (0.0044 ثانية) ============

== 20250304054720 AddScopeModeToApiKeys: جارٍ الترحيل ============================
-- add_column(:api_keys, :scope_mode, :integer, {:null=>true})
   -> 0.0004 ثانية
== 20250304054720 AddScopeModeToApiKeys: تم الترحيل (0.0007 ثانية) ===================

== 20250304074934 BackfillApiKeyScopeModes: جارٍ الترحيل =========================
== 20250304074934 BackfillApiKeyScopeModes: تم الترحيل (0.0010 ثانية) ================

== 20250305233449 PopulateTypeSourceInReviewable: جارٍ الترحيل ===================
== 20250305233449 PopulateTypeSourceInReviewable: تم الترحيل (0.0020 ثانية) ==========

== 20250307031538 MigrateCategoryToCategoriesPostCreated: جارٍ الترحيل ===========
-- execute("DELETE FROM discourse_automation_fields\nWHERE name = 'restricted_categories'\n  AND target = 'trigger'\n  AND automation_id IN (\n    SELECT id FROM discourse_automation_automations\n    WHERE trigger = 'post_created_edited'\n  )\n")
   -> 0.0004 ثانية
-- execute("INSERT INTO discourse_automation_fields (\n  automation_id, component, name, target, metadata, created_at, updated_at\n)\nSELECT\n  f.automation_id,\n  'categories' as component,\n  'restricted_categories' as name,\n  f.target,\n  jsonb_build_object('value', ARRAY[CAST(f.metadata->>'value' AS INTEGER)]) as metadata,\n  NOW() as created_at,\n  NOW() as updated_at\nFROM discourse_automation_fields f\nJOIN discourse_automation_automations a ON a.id = f.automation_id\nWHERE f.component = 'category'\nAND f.name = 'restricted_category'\nAND f.target = 'trigger'\nAND f.metadata->>'value' IS NOT NULL\nAND a.trigger = 'post_created_edited'\n")
   -> 0.0003 ثانية
== 20250307031538 MigrateCategoryToCategoriesPostCreated: تم الترحيل (0.0011 ثانية) ==

== 20250307034117 RemoveOldAdminSidebarEnabledGroupsSiteSettings: جارٍ الترحيل ===
-- execute("DELETE FROM site_settings WHERE name = 'admin_sidebar_enabled_groups'")
   -> 0.0002 ثانية
== 20250307034117 RemoveOldAdminSidebarEnabledGroupsSiteSettings: تم الترحيل (0.0006 ثانية) 

== 20250311041851 AddIndexToPostStatComposerColumns: جارٍ الترحيل ================
-- remove_index(:post_stats, :composer_version, {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0014 ثانية
-- remove_index(:post_stats, :writing_device, {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0011 ثانية
-- add_index(:post_stats, :composer_version, {:algorithm=>:concurrently})
   -> 0.0032 ثانية
-- add_index(:post_stats, :writing_device, {:algorithm=>:concurrently})
   -> 0.0028 ثانية
== 20250311041851 AddIndexToPostStatComposerColumns: تم الترحيل (0.0091 ثانية) =======

== 20250311073009 EnableWelcomeBannerNewSites: جارٍ الترحيل ======================
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('enable_welcome_banner', 5, 'f', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0003 ثانية
== 20250311073009 EnableWelcomeBannerNewSites: تم الترحيل (0.0012 ثانية) =============

== 20250313044812 RemoveUniqueConstraintFromTagUsersIndexes: جارٍ الترحيل ========
-- remove_index(:tag_users, {:name=>:idx_tag_users_ix1, :algorithm=>:concurrently, :if_exists=>true})
   -> 0.0079 ثانية
-- remove_index(:tag_users, {:name=>:idx_tag_users_ix2, :algorithm=>:concurrently, :if_exists=>true})
   -> 0.0074 ثانية
-- remove_index(:tag_users, [:user_id, :tag_id, :notification_level], {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0014 ثانية
-- remove_index(:tag_users, [:tag_id, :user_id, :notification_level], {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0011 ثانية
-- add_index(:tag_users, [:user_id, :tag_id, :notification_level], {:algorithm=>:concurrently})
   -> 0.0028 ثانية
-- add_index(:tag_users, [:tag_id, :user_id, :notification_level], {:algorithm=>:concurrently})
   -> 0.0028 ثانية
== 20250313044812 RemoveUniqueConstraintFromTagUsersIndexes: تم الترحيل (0.0242 ثانية) 

== 20250313045010 AddIndexToUsersIpAddress: جارٍ الترحيل =========================
-- remove_index(:users, :ip_address, {:algorithm=>:concurrently, :name=>"idx_users_ip_address", :if_exists=>true})
   -> 0.0032 ثانية
-- add_index(:users, :ip_address, {:algorithm=>:concurrently, :name=>"idx_users_ip_address"})
   -> 0.0034 ثانية
== 20250313045010 AddIndexToUsersIpAddress: تم الترحيل (0.0073 ثانية) ================


[2025-03-19 02:09:40] إعادة الاتصال بقاعدة البيانات...
[2025-03-19 02:09:40] إعادة تحميل إعدادات الموقع...
[2025-03-19 02:09:40] تعطيل البريد الإلكتروني الصادر للمستخدمين غير الموظفين...
[2025-03-19 02:09:40] تعطيل وضع القراءة فقط...
[2025-03-19 02:09:40] مسح ذاكرة التخزين المؤقت للأقسام...
[2025-03-19 02:09:40] إعادة تحميل الترجمات...
[2025-03-19 02:09:40] إعادة تعيين رفع الملفات...
[2025-03-19 02:09:40] استعادة الملفات المرفوعة، قد يستغرق ذلك بعض الوقت...
[2025-03-19 02:10:00] استثناء: لم يتم إعادة تعيين 1 منشورات إلى عنوان URL الجديد لرفع S3. فشل ترحيل S3 لقاعدة البيانات 'default'.
[2025-03-19 02:10:00] /var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:81:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:383:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:354:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:167:in `restore_uploads'
/var/www/discourse/lib/backup_restore/restorer.rb:71:in `run'
/var/www/discourse/script/spawn_backup_restore.rb:20:in `restore'
/var/www/discourse/script/spawn_backup_restore.rb:33:in `block in <main>'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `<main>'
[2025-03-19 02:10:00] محاولة التراجع...
[2025-03-19 02:10:00] جارٍ التراجع...
[2025-03-19 02:10:00] تنظيف الأشياء...
[2025-03-19 02:10:00] إسقاط الدوال من مخطط discourse_functions...
[2025-03-19 02:10:00] إزالة دليل '/var/www/discourse/tmp/restores/default/2025-03-19-020905' المؤقت...
[2025-03-19 02:10:00] إلغاء إيقاف Sidekiq...
[2025-03-19 02:10:00] تحديد الاستعادة كمكتملة...
[2025-03-19 02:10:00] إعلام 'Admin' بنهاية الاستعادة...

أعتقد أنه يمكنني نشره على أجزاء إذا كان ذلك لا يساعد.

2025-03-19 02:09:05] [STARTED]
[2025-03-19 02:09:05] 'Admin' has started the restore!
[2025-03-19 02:09:05] Marking restore as running...
[2025-03-19 02:09:05] Making sure /var/www/discourse/tmp/restores/default/2025-03-19-020905 exists...
[2025-03-19 02:09:05] Copying archive to tmp directory...
[2025-03-19 02:09:05] Unzipping archive, this may take a while...
[2025-03-19 02:09:06] Extracting dump file...
[2025-03-19 02:09:09] Validating metadata...
[2025-03-19 02:09:09]   Current version: 20250313045010
[2025-03-19 02:09:09]   Restored version: 20210111025920
[2025-03-19 02:09:09] Enabling readonly mode...
[2025-03-19 02:09:09] Pausing sidekiq...
[2025-03-19 02:09:09] Waiting up to 60 seconds for Sidekiq to finish running jobs...
[2025-03-19 02:09:15] Creating missing functions in the discourse_functions schema...
[2025-03-19 02:09:15] Restoring dump file..
[2025-03-19 02:09:31] جارٍ هجرة قاعدة البيانات...
[2025-03-19 02:09:40] == 20190601000001 CreateAutomationsTable: جارٍ الهجرة ===========================
-- create_table(:discourse_automation_automations)
   -> 0.0091s
-- create_table(:discourse_automation_fields)
   -> 0.0061s
-- create_table(:discourse_automation_triggers)
   -> 0.0060s
-- create_table(:discourse_automation_pending_automations)
   -> 0.0034s
== 20190601000001 CreateAutomationsTable: تمّت الهجرة (0.0265s) ==================

== 20201223071241 DeleteStaleCategorySearchPrioritiesFromSiteSettings: جارٍ الهجرة 
-- execute("DELETE FROM site_settings WHERE name IN ('category_search_priority_very_low_weight', 'category_search_priority_very_high_weight')\n")
   -> 0.0006s
== 20201223071241 DeleteStaleCategorySearchPrioritiesFromSiteSettings: تمّت الهجرة (0.0012s) 

== 20210106181418 CreateUserNotificationSchedules: جارٍ الهجرة ==================
-- create_table(:user_notification_schedules)
   -> 0.0043s
-- add_index(:user_notification_schedules, [:user_id], {:name=>"index_user_notification_schedules_on_user_id"})
   -> 0.0026s
-- add_index(:user_notification_schedules, [:enabled], {:name=>"index_user_notification_schedules_on_enabled"})
   -> 0.0024s
-- add_column(:do_not_disturb_timings, :scheduled, :boolean, {:default=>false})
   -> 0.0008s
-- add_index(:do_not_disturb_timings, [:scheduled], {:name=>"index_do_not_disturb_timings_on_scheduled"})
   -> 0.0025s
== 20210106181418 CreateUserNotificationSchedules: تمّت الهجرة (0.0135s) =========

== 20210108134117 AddPendingPmsTable: جارٍ الهجرة ===============================
-- create_table(:discourse_automation_pending_pms)
   -> 0.0067s
== 20210108134117 AddPendingPmsTable: تمّت الهجرة (0.0072s) ======================

== 20210119005647 AddCreatedViaToIncomingEmail: جارٍ الهجرة =====================
-- add_column(:incoming_emails, :created_via, :integer, {:null=>true})
   -> 0.0005s
== 20210119005647 AddCreatedViaToIncomingEmail: تمّت الهجرة (0.0010s) ============

== 20210120125607 RenameEnglishLocale: جارٍ الهجرة ==============================
-- execute("UPDATE users\nSET locale = 'en_GB'\nWHERE locale = 'en'\n")
   -> 0.0007s
-- execute("UPDATE site_settings\nSET value = 'en_GB'\nWHERE name = 'default_locale' AND value = 'en'\n")
   -> 0.0002s
-- execute("UPDATE translation_overrides\nSET locale = 'en_GB'\nWHERE locale = 'en'\n")
   -> 0.0004s
-- execute("UPDATE theme_translation_overrides\nSET locale = 'en_GB'\nWHERE locale = 'en'\n")
   -> 0.0005s
-- execute("UPDATE users\nSET locale = 'en'\nWHERE locale = 'en_US'\n")
   -> 0.0024s
-- execute("UPDATE site_settings\nSET value = 'en'\nWHERE name = 'default_locale' AND value = 'en_US'\n")
   -> 0.0003s
-- execute("UPDATE translation_overrides\nSET locale = 'en'\nWHERE locale = 'en_US'\n")
   -> 0.0002s
-- execute("UPDATE theme_translation_overrides\nSET locale = 'en'\nWHERE locale = 'en_US'\n")
   -> 0.0002s
== 20210120125607 RenameEnglishLocale: تمّت الهجرة (0.0054s) =====================

== 20210121001720 ChangeIncomingEmailCreatedAtNull: جارٍ الهجرة =================
-- change_column_default(:incoming_emails, :created_via, 0)
   -> 0.0032s
-- change_column_null(:incoming_emails, :created_via, false, nil)
   -> 0.0002s
== 20210121001720 ChangeIncomingEmailCreatedAtNull: تمّت الهجرة (0.0046s) ========

== 20210125100452 MigrateSearchDataAfterDefaultLocaleRename: جارٍ الهجرة ========
جارٍ هجرة category_search_data إلى اللغة الجديدة.
-- execute("UPDATE category_search_data\n   SET locale = 'en'\n WHERE category_id IN (\n        SELECT category_id\n          FROM category_search_data\n         WHERE locale = 'en_US'\n         LIMIT 100000\n     )\n")
   -> 0.0008s
تمّت هجرة 11 صفًا من category_search_data إلى اللغة الجديدة.
-- execute("UPDATE category_search_data\n   SET locale = 'en'\n WHERE category_id IN (\n        SELECT category_id\n          FROM category_search_data\n         WHERE locale = 'en_US'\n         LIMIT 100000\n     )\n")
   -> 0.0003s
جارٍ هجرة tag_search_data إلى اللغة الجديدة.
-- execute("UPDATE tag_search_data\n   SET locale = 'en'\n WHERE tag_id IN (\n        SELECT tag_id\n          FROM tag_search_data\n         WHERE locale = 'en_US'\n         LIMIT 100000\n     )\n")
   -> 0.0005s
جارٍ هجرة topic_search_data إلى اللغة الجديدة.
-- execute("UPDATE topic_search_data\n   SET locale = 'en'\n WHERE topic_id IN (\n        SELECT topic_id\n          FROM topic_search_data\n         WHERE locale = 'en_US'\n         LIMIT 100000\n     )\n")
   -> 0.0022s
تمّت هجرة 114 صفًا من topic_search_data إلى اللغة الجديدة.
-- execute("UPDATE topic_search_data\n   SET locale = 'en'\n WHERE topic_id IN (\n        SELECT topic_id\n          FROM topic_search_data\n         WHERE locale = 'en_US'\n         LIMIT 100000\n     )\n")
   -> 0.0004s
جارٍ هجرة user_search_data إلى اللغة الجديدة.
-- execute("UPDATE user_search_data\n   SET locale = 'en'\n WHERE user_id IN (\n        SELECT user_id\n          FROM user_search_data\n         WHERE locale = 'en_US'\n         LIMIT 100000\n     )\n")
   -> 0.0015s
تمّت هجرة 143 صفًا من user_search_data إلى اللغة الجديدة.
-- execute("UPDATE user_search_data\n   SET locale = 'en'\n WHERE user_id IN (\n        SELECT user_id\n          FROM user_search_data\n         WHERE locale = 'en_US'\n         LIMIT 100000\n     )\n")
   -> 0.0003s
== 20210125100452 MigrateSearchDataAfterDefaultLocaleRename: تمّت الهجرة (0.0067s) 

== 20210126222142 CreateShelvedNotifications: جارٍ الهجرة =======================
-- create_table(:shelved_notifications)
   -> 0.0043s
-- add_index(:shelved_notifications, [:notification_id], {:name=>"index_shelved_notifications_on_notification_id"})
   -> 0.0026s
== 20210126222142 CreateShelvedNotifications: تمّت الهجرة (0.0077s) ==============

== 20210127013637 AddUploadSecurityLogColumns: جارٍ الهجرة ======================
-- add_column(:uploads, :security_last_changed_at, :timestamp, {:null=>true, :precision=>nil})
   -> 0.0006s
-- add_column(:uploads, :security_last_changed_reason, :string, {:null=>true})
   -> 0.0003s
== 20210127013637 AddUploadSecurityLogColumns: تمّت الهجرة (0.0014s) =============

== 20210127140730 UndoAddProcessedToNotifications: جارٍ الهجرة ==================
-- execute("ALTER TABLE notifications DROP COLUMN IF EXISTS processed")
   -> 0.0007s
== 20210127140730 UndoAddProcessedToNotifications: تمّت الهجرة (0.0012s) =========

== 20210128021147 AddAllowUnknownSenderTopicRepliesToGroup: جارٍ الهجرة =========
-- add_column(:groups, :allow_unknown_sender_topic_replies, :boolean, {:default=>false, :null=>false})
   -> 0.0010s
== 20210128021147 AddAllowUnknownSenderTopicRepliesToGroup: تمّت الهجرة (0.0015s) 

== 20210131221311 CreateDismissedTopicUsersTable: جارٍ الهجرة ===================
-- create_table(:dismissed_topic_users)
   -> 0.0042s
-- add_index(:dismissed_topic_users, [:user_id, :topic_id], {:unique=>true, :name=>"index_dismissed_topic_users_on_user_id_and_topic_id"})
   -> 0.0032s
== 20210131221311 CreateDismissedTopicUsersTable: تمّت الهجرة (0.0080s) ==========

== 20210201034048 MoveCategoryLastSeenAtToNewTable: جارٍ الهجرة =================
== 20210201034048 MoveCategoryLastSeenAtToNewTable: تمّت الهجرة (0.0067s) ========

== 20210203031628 AddDurationMinutesToTopicTimer: جارٍ الهجرة ===================
-- add_column(:topic_timers, :duration_minutes, :integer)
   -> 0.0005s
== 20210203031628 AddDurationMinutesToTopicTimer: تمّت الهجرة (0.0016s) ==========

== 20210204135429 RenameSsoSiteSettings: جارٍ الهجرة ============================
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'enable_discourse_connect', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'enable_sso'\n")
   -> 0.0006s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_allows_all_return_paths', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_allows_all_return_paths'\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'enable_discourse_connect_provider', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'enable_sso_provider'\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'verbose_discourse_connect_logging', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'verbose_sso_logging'\n")
   -> 0.0003s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_url', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_url'\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_secret', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_secret'\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_provider_secrets', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_provider_secrets'\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_overrides_groups', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_groups'\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_overrides_bio', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_bio'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'auth_overrides_email', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_email'\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'auth_overrides_username', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_username'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'auth_overrides_name', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_name'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_overrides_avatar', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_avatar'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_overrides_profile_background', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_profile_background'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_overrides_location', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_location'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_overrides_website', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_website'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_overrides_card_background', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'sso_overrides_card_background'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'auth_skip_create_confirm', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'external_auth_skip_create_confirm'\n")
   -> 0.0001s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'auth_immediately', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'external_auth_immediately'\n")
   -> 0.0002s
== 20210204135429 RenameSsoSiteSettings: تمّت الهجرة (0.0045s) ===================

== 20210204195932 AddReplacementToWatchedWords: جارٍ الهجرة =====================
-- add_column(:watched_words, :replacement, :string, {:null=>true})
   -> 0.0004s
== 20210204195932 AddReplacementToWatchedWords: تمّت الهجرة (0.0008s) ============

== 20210207232853 FixTopicTimerDurationMinutes: جارٍ الهجرة =====================
== 20210207232853 FixTopicTimerDurationMinutes: تمّت الهجرة (0.0009s) ============

== 20210215231312 FixGroupFlairAvatarUploadSecurityAndAcls: جارٍ الهجرة =========
== 20210215231312 FixGroupFlairAvatarUploadSecurityAndAcls: تمّت الهجرة (0.0008s) 

== 20210218022739 MoveNewSinceToNewTableAgain: جارٍ الهجرة ======================
== 20210218022739 MoveNewSinceToNewTableAgain: تمّت الهجرة (0.0100s) =============

== 20210218144656 AddIsFavoriteToUserBadge: جارٍ الهجرة =========================
-- add_column(:user_badges, :is_favorite, :boolean)
   -> 0.0005s
== 20210218144656 AddIsFavoriteToUserBadge: تمّت الهجرة (0.0009s) ================

== 20210219171329 DropOldSsoSiteSettings: جارٍ الهجرة ===========================
-- execute("DELETE FROM site_settings\nWHERE name IN (\n  'enable_sso',\n  'sso_allows_all_return_paths',\n  'enable_sso_provider',\n  'verbose_sso_logging',\n  'sso_url',\n  'sso_secret',\n  'sso_provider_secrets',\n  'sso_overrides_groups',\n  'sso_overrides_bio',\n  'sso_overrides_email',\n  'sso_overrides_username',\n  'sso_overrides_name',\n  'sso_overrides_avatar',\n  'sso_overrides_profile_background',\n  'sso_overrides_location',\n  'sso_overrides_website',\n  'sso_overrides_card_background',\n  'external_auth_skip_create_confirm',\n  'external_auth_immediately'\n)\n")
   -> 0.0002s
== 20210219171329 DropOldSsoSiteSettings: تمّت الهجرة (0.0006s) ==================

== 20210224162050 RemoveEmojiOneFromEmojiSetSiteSetting: جارٍ الهجرة ============
-- execute("SELECT value FROM site_settings WHERE name='emoji_set' and value='emoji_one'")
   -> 0.0002s
== 20210224162050 RemoveEmojiOneFromEmojiSetSiteSetting: تمّت الهجرة (0.0006s) ===

== 20210225230057 CreateChatTables: جارٍ الهجرة =================================
-- create_table(:topic_chats)
   -> 0.0075s
-- create_table(:topic_chat_messages)
   -> 0.0095s
-- add_index(:topic_chat_messages, [:topic_id, :created_at], {:name=>"index_topic_chat_messages_on_topic_id_and_created_at"})
   -> 0.0024s
== 20210225230057 CreateChatTables: تمّت الهجرة (0.0202s) ========================

== 20210302164429 DropFlashOneboxSiteSetting: جارٍ الهجرة =======================
-- execute("DELETE FROM site_settings\nWHERE name = 'enable_flash_video_onebox'\n")
   -> 0.0002s
== 20210302164429 DropFlashOneboxSiteSetting: تمّت الهجرة (0.0006s) ==============

== 20210308010745 DeleteOrphanPostActions: جارٍ الهجرة ==========================
-- execute("DELETE FROM post_actions\nUSING post_actions pa\nLEFT JOIN posts ON posts.id = pa.post_id\nWHERE posts.id IS NULL\nAND post_actions.id = pa.id\n")
   -> 0.0016s
== 20210308010745 DeleteOrphanPostActions: تمّت الهجرة (0.0019s) =================

== 20210308195916 AddUniqueIndexToInvitedGroups: جارٍ الهجرة ====================
-- execute("DELETE FROM invited_groups a\nUSING invited_groups b\nWHERE a.id < b.id\n  AND a.invite_id = b.invite_id\n  AND a.group_id = b.group_id\n")
   -> 0.0005s
-- add_index(:invited_groups, [:group_id, :invite_id], {:unique=>true, :name=>"index_invited_groups_on_group_id_and_invite_id"})
   -> 0.0032s
== 20210308195916 AddUniqueIndexToInvitedGroups: تمّت الهجرة (0.0042s) ===========

== 20210311022303 DropShowFilterByTagSiteSetting: جارٍ الهجرة ===================
-- execute("DELETE FROM site_settings\nWHERE name = 'show_filter_by_tag'\n")
   -> 0.0002s
== 20210311022303 DropShowFilterByTagSiteSetting: تمّت الهجرة (0.0006s) ==========

== 20210311070755 AddImageUploadIdToBadges: جارٍ الهجرة =========================
-- add_column(:badges, :image_upload_id, :integer)
   -> 0.0005s
== 20210311070755 AddImageUploadIdToBadges: تمّت الهجرة (0.0024s) ================

== 20210315173137 SetDisableMailingListMode: جارٍ الهجرة ========================
-- execute("SELECT COUNT(*) FROM user_options WHERE mailing_list_mode")
   -> 0.0003s
== 20210315173137 SetDisableMailingListMode: تمّت الهجرة (0.0007s) ===============

== 20210318020143 AddPinnedColumnToBookmarks: جارٍ الهجرة =======================
-- add_column(:bookmarks, :pinned, :boolean, {:default=>false})
   -> 0.0007s
== 20210318020143 AddPinnedColumnToBookmarks: تمّت الهجرة (0.0013s) ==============

== 20210323142518 UpdateInvitesRedemptionCount: جارٍ الهجرة =====================
-- execute("WITH invite_counts AS (\n  SELECT invite_id, COUNT(*) count\n  FROM invited_users\n  GROUP BY invite_id\n)\nUPDATE invites\nSET redemption_count = GREATEST(redemption_count, count)\nFROM invite_counts\nWHERE invites.id = invite_counts.invite_id\n")
   -> 0.0010s
== 20210323142518 UpdateInvitesRedemptionCount: تمّت الهجرة (0.0014s) ============

== 20210324043327 DeleteOrphanPostRevisions: جارٍ الهجرة ========================
-- execute("DELETE FROM post_revisions\nUSING post_revisions pr\nLEFT JOIN posts ON posts.id = pr.post_id\nWHERE posts.id IS NULL\nAND post_revisions.id = pr.id\n")
   -> 0.0008s
== 20210324043327 DeleteOrphanPostRevisions: تمّت الهجرة (0.0012s) ===============

== 20210328233843 FixBookmarksWithIncorrectTopicId: جارٍ الهجرة =================
== 20210328233843 FixBookmarksWithIncorrectTopicId: تمّت الهجرة (0.0016s) ========

== 20210403025854 AddActionCodeToTopicChatMessage: جارٍ الهجرة ==================
-- add_column(:topic_chat_messages, :action_code, :string, {:null=>true})
   -> 0.0005s
== 20210403025854 AddActionCodeToTopicChatMessage: تمّت الهجرة (0.0008s) =========

== 20210406060434 FixTopicUserBookmarkedSyncIssuesAgain: جارٍ الهجرة ============
== 20210406060434 FixTopicUserBookmarkedSyncIssuesAgain: تمّت الهجرة (0.0014s) ===

== 20210409142455 AddTokenToInvites: جارٍ الهجرة ================================
-- add_column(:invites, :email_token, :string)
   -> 0.0005s
== 20210409142455 AddTokenToInvites: تمّت الهجرة (0.0015s) =======================

== 20210414013318 AddCategorySettingAllowUnlimitedOwnerEditsOp: جارٍ الهجرة =====
-- add_column(:categories, :allow_unlimited_owner_edits_on_first_post, :boolean, {:default=>false, :null=>false})
   -> 0.0008s
== 20210414013318 AddCategorySettingAllowUnlimitedOwnerEditsOp: تمّت الهجرة (0.0013s) 

== 20210420015635 AddSearchableToUserFields: جارٍ الهجرة ========================
-- add_column(:user_fields, :searchable, :boolean, {:default=>false, :null=>false})
   -> 0.0006s
== 20210420015635 AddSearchableToUserFields: تمّت الهجرة (0.0009s) ===============

== 20210426193009 MoveApprovedQueuedPostsTopicAndPostData: جارٍ الهجرة ==========
== 20210426193009 MoveApprovedQueuedPostsTopicAndPostData: تمّت الهجرة (0.0013s) =

== 20210512090204 AddTimestampsToAutomations: جارٍ الهجرة =======================
-- add_column(:discourse_automation_automations, :last_updated_by_id, :integer, {:null=>true})
   -> 0.0004s
-- execute("ALTER TABLE discourse_automation_automations ALTER COLUMN last_updated_by_id SET NOT NULL;\n")
   -> 0.0002s
== 20210512090204 AddTimestampsToAutomations: تمّت الهجرة (0.0013s) ==============

== 20210513125608 RemoveLengthConstrainFromTopicExcerpt: جارٍ الهجرة ============
-- change_column(:topics, :excerpt, :string, {:null=>true})
   -> 0.0004s
== 20210513125608 RemoveLengthConstrainFromTopicExcerpt: تمّت الهجرة (0.0008s) ===

== 20210517061815 AddDedicatedEnableImapSmtpColumnsForGroup: جارٍ الهجرة ========
-- add_column(:groups, :smtp_enabled, :boolean, {:default=>false})
   -> 0.0006s
-- add_column(:groups, :smtp_updated_at, :timestamp, {:null=>true, :precision=>nil})
   -> 0.0002s
-- add_column(:groups, :smtp_updated_by_id, :integer, {:null=>true})
   -> 0.0002s
-- add_column(:groups, :imap_enabled, :boolean, {:default=>false})
   -> 0.0005s
-- add_column(:groups, :imap_updated_at, :timestamp, {:null=>true, :precision=>nil})
   -> 0.0002s
-- add_column(:groups, :imap_updated_by_id, :integer, {:null=>true})
   -> 0.0002s
== 20210517061815 AddDedicatedEnableImapSmtpColumnsForGroup: تمّت الهجرة (0.0028s) 

== 20210517073211 AddStalledWikiCustomFieldsIndex: جارٍ الهجرة ==================
-- add_index(:post_custom_fields, :post_id, {:unique=>true, :name=>"index_post_custom_fields_on_stalled_wiki_triggered_at", :where=>"name = 'stalled_wiki_triggered_at'"})
   -> 0.0050s
== 20210517073211 AddStalledWikiCustomFieldsIndex: تمّت الهجرة (0.0054s) =========

== 20210525112226 RemoveLengthConstrainFromTopicLinkUrl: جارٍ الهجرة ============
-- change_column(:topic_links, :url, :string, {:null=>false})
   -> 0.0009s
== 20210525112226 RemoveLengthConstrainFromTopicLinkUrl: تمّت الهجرة (0.0013s) ===

== 20210526053611 AddErrorCountToPushSubscriptions: جارٍ الهجرة =================
-- add_column(:push_subscriptions, :error_count, :integer, {:null=>false, :default=>0})
   -> 0.0006s
-- add_column(:push_subscriptions, :first_error_at, :timestamp, {:precision=>nil})
   -> 0.0002s
== 20210526053611 AddErrorCountToPushSubscriptions: تمّت الهجرة (0.0012s) ========

== 20210527114834 SetTaggingEnabled: جارٍ الهجرة ================================
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('tagging_enabled', 5, 'f', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0002s
== 20210527114834 SetTaggingEnabled: تمّت الهجرة (0.0013s) =======================

== 20210527131318 CreateDirectoryColumns: جارٍ الهجرة ===========================
-- create_table(:directory_columns)
   -> 0.0064s
-- add_index(:directory_columns, [:enabled, :position, :user_field_id], {:name=>"directory_column_index"})
   -> 0.0023s
== 20210527131318 CreateDirectoryColumns: تمّت الهجرة (0.0098s) ==================

== 20210528003603 FixBadgeImageAvatarUploadSecurityAndAcls: جارٍ الهجرة =========
== 20210528003603 FixBadgeImageAvatarUploadSecurityAndAcls: تمّت الهجرة (0.0010s) 

== 20210528144647 MigrateWatchedWordsFromReplaceToLink: جارٍ الهجرة =============
-- execute("UPDATE watched_words\nSET action = 8\nWHERE action = 5 AND replacement ILIKE 'http%'\n")
   -> 0.0005s
== 20210528144647 MigrateWatchedWordsFromReplaceToLink: تمّت الهجرة (0.0008s) ====

== 20210528203310 PostMigrateGiftFromPmToPms: جارٍ الهجرة =======================
== 20210528203310 PostMigrateGiftFromPmToPms: تمّت الهجرة (0.0007s) ==============

== 20210530122323 MoveTriggersToFields: جارٍ الهجرة =============================
-- add_column(:discourse_automation_automations, :trigger, :string, {:null=>true})
   -> 0.0004s
-- add_column(:discourse_automation_fields, :target, :string, {:null=>true})
   -> 0.0004s
== 20210530122323 MoveTriggersToFields: تمّت الهجرة (0.0014s) ====================

== 20210530122334 MoveExistingTriggersToFields: جارٍ الهجرة =====================
-- execute("DROP TABLE IF EXISTS discourse_automation_triggers;\n")
   -> 0.0007s
== 20210530122334 MoveExistingTriggersToFields: تمّت الهجرة (0.0014s) ============

== 20210601002145 RenameTrustLevelTranslations: جارٍ الهجرة =====================
-- execute("UPDATE translation_overrides\nSET translation_key = 'js.trust_levels.names.newuser'\nWHERE translation_key = 'trust_levels.newuser.title'\n")
   -> 0.0003s
-- execute("UPDATE translation_overrides\nSET translation_key = 'js.trust_levels.names.basic'\nWHERE translation_key = 'trust_levels.basic.title'\n")
   -> 0.0002s
-- execute("UPDATE translation_overrides\nSET translation_key = 'js.trust_levels.names.member'\nWHERE translation_key = 'trust_levels.member.title'\n")
   -> 0.0002s
-- execute("UPDATE translation_overrides\nSET translation_key = 'js.trust_levels.names.regular'\nWHERE translation_key = 'trust_levels.regular.title'\n")
   -> 0.0001s
-- execute("UPDATE translation_overrides\nSET translation_key = 'js.trust_levels.names.leader'\nWHERE translation_key = 'trust_levels.leader.title'\n")
   -> 0.0001s
== 20210601002145 RenameTrustLevelTranslations: تمّت الهجرة (0.0015s) ============

== 20210603135629 ConvertDateComponentToDateTime: جارٍ الهجرة ===================
== 20210603135629 ConvertDateComponentToDateTime: تمّت الهجرة (0.0006s) ==========

== 20210614232334 AddSmtpGroupIdToEmailLog: جارٍ الهجرة =========================
-- add_column(:email_logs, :smtp_group_id, :integer, {:null=>true, :index=>true})
   -> 0.0006s
== 20210614232334 AddSmtpGroupIdToEmailLog: تمّت الهجرة (0.0010s) ================

== 20210617183010 AddAutomaticColumnDirectoryColumns: جارٍ الهجرة ===============
== 20210617183010 AddAutomaticColumnDirectoryColumns: تمّت الهجرة (0.0016s) ======

== 20210617202227 ChangeAutomaticOnDirectoryColumnsToBool: جارٍ الهجرة ==========
-- remove_column(:directory_columns, :automatic)
   -> 0.0004s
-- add_column(:directory_columns, :automatic, :boolean, {:default=>true, :null=>false})
   -> 0.0005s
-- execute("UPDATE directory_columns SET automatic = (user_field_id IS NULL);\n")
   -> 0.0003s
== 20210617202227 ChangeAutomaticOnDirectoryColumnsToBool: تمّت الهجرة (0.0023s) =

== 20210618135229 ReintroduceTypeToDirectoryColumns: جارٍ الهجرة ================
-- add_column(:directory_columns, :type, :integer, {:default=>0, :null=>false})
   -> 0.0006s
== 20210618135229 ReintroduceTypeToDirectoryColumns: تمّت الهجرة (0.0024s) =======

== 20210621002201 AddColumnsToEmailLogToMatchIncomingForSmtpImap: جارٍ الهجرة ===
-- add_column(:email_logs, :cc_addresses, :text, {:null=>true})
   -> 0.0003s
-- add_column(:email_logs, :cc_user_ids, :integer, {:array=>true, :null=>true})
   -> 0.0002s
-- add_column(:email_logs, :raw, :text, {:null=>true})
   -> 0.0002s
-- add_column(:email_logs, :topic_id, :integer, {:null=>true})
   -> 0.0003s
-- add_index(:email_logs, :topic_id, {:where=>"topic_id IS NOT NULL", :name=>"index_email_logs_on_topic_id"})
   -> 0.0052s
== 20210621002201 AddColumnsToEmailLogToMatchIncomingForSmtpImap: تمّت الهجرة (0.0071s) 

== 20210621103509 AddBanneredUntil: جارٍ الهجرة =================================
-- add_column(:topics, :bannered_until, :timestamp, {:null=>true, :precision=>nil})
   -> 0.0005s
-- add_index(:topics, :bannered_until, {:where=>"bannered_until IS NOT NULL", :name=>"index_topics_on_bannered_until"})
   -> 0.0066s
== 20210621103509 AddBanneredUntil: تمّت الهجرة (0.0078s) ========================

== 20210621190335 MigratePendingUsersReminderDelaySetting: جارٍ الهجرة ==========
== 20210621190335 MigratePendingUsersReminderDelaySetting: تمّت الهجرة (0.0010s) =

== 20210621234939 BackfillEmailLogTopicId: جارٍ الهجرة ==========================
== 20210621234939 BackfillEmailLogTopicId: تمّت الهجرة (0.0015s) =================

== 20210624023831 RemoveHighestSeenPostNumberFromTopicUsers: جارٍ الهجرة ========
== 20210624023831 RemoveHighestSeenPostNumberFromTopicUsers: تمّت الهجرة (0.0020s) 

== 20210624080131 AddPartialIndexPinnedUntil: جارٍ الهجرة =======================
-- execute("CREATE INDEX CONCURRENTLY IF NOT EXISTS \"index_topics_on_pinned_until\"\nON \"topics\" (\"pinned_until\")\nWHERE pinned_until IS NOT NULL\n")
   -> 0.0038s
== 20210624080131 AddPartialIndexPinnedUntil: تمّت الهجرة (0.0044s) ==============

== 20210625203049 AddFlairGroupIdToUsers: جارٍ الهجرة ===========================
-- add_column(:users, :flair_group_id, :integer, {:null=>true})
   -> 0.0004s
== 20210625203049 AddFlairGroupIdToUsers: تمّت الهجرة (0.0009s) ==================

== 20210628035905 DropDurationColumnFromTopicTimers: جارٍ الهجرة ================
== 20210628035905 DropDurationColumnFromTopicTimers: تمّت الهجرة (0.0013s) =======

== 20210701233509 DeleteOldReminderTopicTimers: جارٍ الهجرة =====================
== 20210701233509 DeleteOldReminderTopicTimers: تمّت الهجرة (0.0005s) ============

== 20210702084757 ForceValueForEveryFields: جارٍ الهجرة =========================
== 20210702084757 ForceValueForEveryFields: تمّت الهجرة (0.0126s) ================

== 20210702204007 AddDefaultAutoCloseSecondsToCategory: جارٍ الهجرة =============
-- add_column(:categories, :default_slow_mode_seconds, :integer)
   -> 0.0007s
== 20210702204007 AddDefaultAutoCloseSecondsToCategory: تمّت الهجرة (0.0011s) ====

== 20210706091905 DropDisableJumpReplyColumnFromUserOptions: جارٍ الهجرة ========
== 20210706091905 DropDisableJumpReplyColumnFromUserOptions: تمّت الهجرة (0.0015s) 

== 20210706214013 RenameTopicChatsToChatChannels: جارٍ الهجرة ===================
-- rename_table(:topic_chats, :chat_channels)
   -> 0.0042s
-- rename_column(:chat_channels, :topic_id, :chatable_id)
   -> 0.0016s
-- change_column(:chat_channels, :chatable_id, :integer, {:unique=>false})
   -> 0.0006s
-- add_column(:chat_channels, :chatable_type, :string)
   -> 0.0031s
-- change_column_null(:chat_channels, :chatable_type, false, nil)
   -> 0.0003s
-- add_index(:chat_channels, [:chatable_id, :chatable_type], {:name=>"index_chat_channels_on_chatable_id_and_chatable_type"})
   -> 0.0028s
-- rename_table(:topic_chat_messages, :chat_messages)
   -> 0.0037s
-- rename_column(:chat_messages, :topic_id, :chat_channel_id)
   -> 0.0019s
-- change_column_null(:chat_messages, :post_id, true, nil)
   -> 0.0004s
== 20210706214013 RenameTopicChatsToChatChannels: تمّت الهجرة (0.0198s) ==========

== 20210708035525 AddUserIdIndexToPostRevisions: جارٍ الهجرة ====================
-- add_index(:post_revisions, :user_id, {:name=>"index_post_revisions_on_user_id"})
   -> 0.0031s
== 20210708035525 AddUserIdIndexToPostRevisions: تمّت الهجرة (0.0036s) ===========

== 20210708035538 AddPostEditsCountToUserStats: جارٍ الهجرة =====================
-- add_column(:user_stats, :post_edits_count, :integer)
   -> 0.0004s
== 20210708035538 AddPostEditsCountToUserStats: تمّت الهجرة (0.0028s) ============

== 20210709042135 CreateExternalUploadStubs: جارٍ الهجرة ========================
-- create_table(:external_upload_stubs)
   -> 0.0114s
-- add_index(:external_upload_stubs, [:key], {:unique=>true, :name=>"index_external_upload_stubs_on_key"})
   -> 0.0026s
== 20210709042135 CreateExternalUploadStubs: تمّت الهجرة (0.0146s) ===============

== 20210709053030 DropUploadsVerified: جارٍ الهجرة ==============================
== 20210709053030 DropUploadsVerified: تمّت الهجرة (0.0017s) =====================

== 20210713092503 SetUsersFlairGroupId: جارٍ الهجرة =============================
-- execute("UPDATE users\nSET flair_group_id = primary_group_id\nFROM groups\nWHERE users.primary_group_id = groups.id AND\n      users.flair_group_id IS NULL AND\n      (groups.flair_icon IS NOT NULL OR groups.flair_upload_id IS NOT NULL)\n")
   -> 0.0008s
== 20210713092503 SetUsersFlairGroupId: تمّت الهجرة (0.0012s) ====================

== 20210720221817 AddDraftCountToUserStat: جارٍ الهجرة ==========================
-- add_column(:user_stats, :draft_count, :integer, {:default=>0, :null=>false})
   -> 0.0007s
-- execute("UPDATE user_stats\nSET draft_count = new_user_stats.draft_count\nFROM (SELECT user_stats.user_id, COUNT(drafts.id) draft_count\n      FROM user_stats\n      LEFT JOIN drafts ON user_stats.user_id = drafts.user_id\n      GROUP BY user_stats.user_id) new_user_stats\nWHERE user_stats.user_id = new_user_stats.user_id\n  AND user_stats.draft_count <> new_user_stats.draft_count\n")
   -> 0.0008s
== 20210720221817 AddDraftCountToUserStat: تمّت الهجرة (0.0019s) =================

== 20210729134042 CreateChatMessageRevisions: جارٍ الهجرة =======================
-- create_table(:chat_message_revisions)
   -> 0.0068s
-- add_index(:chat_message_revisions, [:chat_message_id], {:name=>"index_chat_message_revisions_on_chat_message_id"})
   -> 0.0041s
== 20210729134042 CreateChatMessageRevisions: تمّت الهجرة (0.0116s) ==============

== 20210730134847 CreateUserChatChannelLastRead: جارٍ الهجرة ====================
-- create_table(:user_chat_channel_last_reads)
   -> 0.0049s
-- add_index(:user_chat_channel_last_reads, [:chat_channel_id, :user_id], {:unique=>true, :name=>"user_chat_channel_reads_index"})
   -> 0.0028s
== 20210730134847 CreateUserChatChannelLastRead: تمّت الهجرة (0.0084s) ===========

== 20210802131421 RemovePostProcessedTriggerOption: جارٍ الهجرة =================
== 20210802131421 RemovePostProcessedTriggerOption: تمّت الهجرة (0.0007s) ========

== 20210805204149 MakesAutomationDisabledByDefault: جارٍ الهجرة =================
-- change_column_default(:discourse_automation_automations, :enabled, false)
   -> 0.0034s
== 20210805204149 MakesAutomationDisabledByDefault: تمّت الهجرة (0.0040s) ========

```== 20210812033033 AddMultipartAndSizeColumnsToExternalUploadStubs: جاري الهجرة ==
-- add_column(:external_upload_stubs, :multipart, :boolean, {:default=>false, :null=>false})
   -> 0.0022 ثانية
-- add_column(:external_upload_stubs, :external_upload_identifier, :string, {:null=>true})
   -> 0.0003 ثانية
-- add_column(:external_upload_stubs, :filesize, :bigint)
   -> 0.0003 ثانية
-- add_index(:external_upload_stubs, :external_upload_identifier, {:name=>"index_external_upload_stubs_on_external_upload_identifier"})
   -> 0.0047 ثانية
-- change_column_null(:external_upload_stubs, :filesize, false, nil)
   -> 0.0019 ثانية
== 20210812033033 AddMultipartAndSizeColumnsToExternalUploadStubs: تمّت الهجرة (0.0108 ثانية) 

== 20210812145801 CreateDirectMessageTables: جاري الهجرة ========================
-- create_table(:direct_message_channels)
   -> 0.0040 ثانية
-- create_table(:direct_message_users)
   -> 0.0051 ثانية
-- add_index(:direct_message_users, [:direct_message_channel_id, :user_id], {:unique=>true, :name=>"direct_message_users_index"})
   -> 0.0031 ثانية
== 20210812145801 CreateDirectMessageTables: تمّت الهجرة (0.0129 ثانية) ===============

== 20210813141741 AddTimestampsToChatChannels: جاري الهجرة ======================
-- add_column(:chat_channels, :created_at, :timestamp)
   -> 0.0013 ثانية
-- add_column(:chat_channels, :updated_at, :timestamp)
   -> 0.0012 ثانية
-- change_column_null(:chat_channels, :created_at, false, nil)
   -> 0.0002 ثانية
-- change_column_null(:chat_channels, :updated_at, false, nil)
   -> 0.0002 ثانية
== 20210813141741 AddTimestampsToChatChannels: تمّت الهجرة (0.0051 ثانية) =============

== 20210819152920 ChangeAllowUploadedAvatars: جاري الهجرة =======================
-- execute("UPDATE site_settings\nSET data_type = 7, value = (CASE WHEN value = 'f' THEN 'disabled' ELSE '0' END)\nWHERE name = 'allow_uploaded_avatars'\n")
   -> 0.0003 ثانية
== 20210819152920 ChangeAllowUploadedAvatars: تمّت الهجرة (0.0006 ثانية) ==============

== 20210819202912 CreateIncomingChatWebhooks: جاري الهجرة =======================
-- create_table(:incoming_chat_webhooks)
   -> 0.0083 ثانية
-- add_index(:incoming_chat_webhooks, [:key, :chat_channel_id], {:name=>"index_incoming_chat_webhooks_on_key_and_chat_channel_id"})
   -> 0.0028 ثانية
== 20210819202912 CreateIncomingChatWebhooks: تمّت الهجرة (0.0118 ثانية) ==============

== 20210823160357 CreateChatWebhookEvents: جاري الهجرة ==========================
-- create_table(:chat_webhook_events)
   -> 0.0057 ثانية
-- add_index(:chat_webhook_events, [:chat_message_id, :incoming_chat_webhook_id], {:unique=>true, :name=>"chat_webhook_events_index"})
   -> 0.0026 ثانية
== 20210823160357 CreateChatWebhookEvents: تمّت الهجرة (0.0090 ثانية) =================

== 20210824203421 RemovePostTimingsSummaryIndex: جاري الهجرة ====================
-- remove_index(:post_timings, {:column=>[:topic_id, :post_number], :name=>:post_timings_summary, :if_exists=>true})
   -> 0.0056 ثانية
== 20210824203421 RemovePostTimingsSummaryIndex: تمّت الهجرة (0.0077 ثانية) ===========

== 20210901130308 CreateUserChatChannelMembership: جاري الهجرة ==================
-- create_table(:user_chat_channel_memberships)
   -> 0.0079 ثانية
-- add_index(:user_chat_channel_memberships, [:user_id, :chat_channel_id, :desktop_notification_level, :mobile_notification_level, :following], {:name=>"user_chat_channel_memberships_index"})
   -> 0.0030 ثانية
-- add_index(:user_chat_channel_memberships, [:user_id, :chat_channel_id], {:unique=>true, :name=>"user_chat_channel_unique_memberships"})
   -> 0.0026 ثانية
== 20210901130308 CreateUserChatChannelMembership: تمّت الهجرة (0.0155 ثانية) =========

== 20210909041448 MakeTopicIdNullableForBookmarks: جاري الهجرة ==================
-- change_column_null(:bookmarks, :topic_id, true, nil)
   -> 0.0003 ثانية
== 20210909041448 MakeTopicIdNullableForBookmarks: تمّت الهجرة (0.0076 ثانية) =========

== 20210913032326 AddForTopicToBookmarks: جاري الهجرة ===========================
-- add_column(:bookmarks, :for_topic, :boolean, {:default=>false, :null=>false})
   -> 0.0007 ثانية
-- add_index(:bookmarks, [:user_id, :post_id, :for_topic], {:unique=>true, :name=>"index_bookmarks_on_user_id_and_post_id_and_for_topic"})
   -> 0.0042 ثانية
-- index_exists?(:bookmarks, [:user_id, :post_id])
   -> 0.0058 ثانية
-- remove_index(:bookmarks, [:user_id, :post_id])
   -> 0.0048 ثانية
== 20210913032326 AddForTopicToBookmarks: تمّت الهجرة (0.0188 ثانية) ==================

== 20210914011037 ChangeUploadsFilesizeToBigint: جاري الهجرة ====================
-- change_column(:uploads, :filesize, :bigint)
   -> 0.0289 ثانية
== 20210914011037 ChangeUploadsFilesizeToBigint: تمّت الهجرة (0.0296 ثانية) ===========

== 20210914152002 UpdateValueOnThemeSettingForUploadType: جاري الهجرة ===========
-- execute("UPDATE theme_settings\nSET value = (SELECT id FROM uploads WHERE uploads.url = theme_settings.value)\nWHERE data_type = 6\n")
   -> 0.0009 ثانية
== 20210914152002 UpdateValueOnThemeSettingForUploadType: تمّت الهجرة (0.0014 ثانية) ==

== 20210915142958 AddPendingPostsCountToUserStats: جاري الهجرة ==================
-- add_column(:user_stats, :pending_posts_count, :integer, {:null=>false, :default=>0})
   -> 0.0008 ثانية
== 20210915142958 AddPendingPostsCountToUserStats: تمّت الهجرة (0.0013 ثانية) =========

== 20210915215952 MarkReminderTypeAsReadonlyForBookmarks: جاري الهجرة ===========
== 20210915215952 MarkReminderTypeAsReadonlyForBookmarks: تمّت الهجرة (0.0040 ثانية) ==

== 20210915222124 DropReminderTypeIndexForBookmarks: جاري الهجرة ================
-- index_exists?(:bookmarks, [:reminder_type])
   -> 0.0083 ثانية
-- remove_index(:bookmarks, [:reminder_type])
   -> 0.0079 ثانية
== 20210915222124 DropReminderTypeIndexForBookmarks: تمّت الهجرة (0.0184 ثانية) =======

== 20210915222124 DropReminderTypeIndexForBookmarks: migrating ================
-- index_exists?(:bookmarks, [:reminder_type])
   -> 0.0083s
-- remove_index(:bookmarks, [:reminder_type])
   -> 0.0079s
== 20210915222124 DropReminderTypeIndexForBookmarks: migrated (0.0184s) =======

== 20210920044353 AddDefaultCalendarToUserOptions: migrating ==================
-- add_column(:user_options, :default_calendar, :integer, {:default=>0, :null=>false})
   -> 0.0009s
-- add_index(:user_options, [:user_id, :default_calendar], {:name=>"index_user_options_on_user_id_and_default_calendar"})
   -> 0.0034s
== 20210920044353 AddDefaultCalendarToUserOptions: migrated (0.0052s) =========

== 20210922064213 AlterBumpedAtIndexesOnTopics: migrating =====================
-- execute("CREATE INDEX CONCURRENTLY IF NOT EXISTS index_topics_on_bumped_at_public\nON topics (bumped_at)\nWHERE ((deleted_at IS NULL) AND ((archetype)::text <> 'private_message'::text));\n")
   -> 0.0043s
-- execute("DROP INDEX IF EXISTS index_topics_on_bumped_at;\n")
   -> 0.0041s
-- execute("DROP INDEX IF EXISTS index_forum_threads_on_bumped_at;\n")
   -> 0.0002s
== 20210922064213 AlterBumpedAtIndexesOnTopics: migrated (0.0093s) ============

== 20210928161912 MigrateDeprecatedHtmlSettingType: migrating =================
-- execute("UPDATE site_settings\nSET data_type = 1\nWHERE data_type = 25\n")
   -> 0.0002s
== 20210928161912 MigrateDeprecatedHtmlSettingType: migrated (0.0006s) ========

== 20210929215543 AddTokenHashToEmailToken: migrating =========================
-- add_column(:email_tokens, :token_hash, :string)
   -> 0.0005s
-- execute("UPDATE email_tokens\nSET token_hash = data.token_hash\nFROM (VALUES (2, 'a22d030d9178c9fcbf94078d4757446909cf50ad81734856b1c7513508f04193'),(1, 'ad7977cb12df9c64427978890210db8bfb1138a932e6c7aa33cbc656a5905f26'),(3, '6eaed81c83bae1aa9f6144cd97269ea190b936d34feabdb6553ccb092bd97a8d'),(6, '5722b3981c6581e3df04dc3a5c008d94a610dd68974fd910bc3dd25ca7b69db8'),(33, '6bd0f928bbb464dac1b4a6a271079e55587db40ec814f8a1fff92562cc86af88'),(10, '764b34d1a967542218dce691e0be27453cabb95dfcfe357d3754e00ad3832250'),(8, 'ad1a7482b60b5aafa32f8df3924a8361d18df61e6fb24897af7696b3b40bdb3a'),(11, '76ee2b64ff94a61204fdaaf428fc7bcd64b11f5b452d2b5688efdbcebb377f35'),(9, '09aced77721c0b6527cda6434b00242f77dc0d4b77dec5540b6774504fd82861'),(34, 'da199be00355423e7af42bc8502cacc92cc4eba7ca3ce51a8b2af09c6ae59bc4'),(12, 'b95d2e1b18275f31df5361aa34b9677f5cd53265202c4991eb26f4be25b2418c'),(14, '221a39525baa5914dc188f9719f1d4a476c07d8e4c06a81a0216cdd6ed88983a'),(35, 'eea901e1523bdbb4ccfc4fa6f65885f188e0c0bcb929b4fdbf73e2242596a93d'),(15, '579e4e15f61570c571dff216262bd7fed3b7106ffedb7b10d7e8cc10192be60f'),(59, 'c25596295135c6149c3e546401bfb7fcaa550c5de6f603c1ca54f1281e4be5cd'),(17, 'f91b6658c2e7d1236a30c6aece7fe15ae7e663a7ac735a695826ea435d299405'),(18, '87bda21d5b1a99568a5f9ed0f3088cf4ff80efc6a8c5eca0cac5fd29e75556fb'),(21, '581f3b814c230dda03c8c3d7bf0c55e4c73f3e4d53885a0cb661a7a166d432ad'),(22, '8517bcde1f251dee0a5099d97e29d3204751fd6a30d0678806e60df2f2cd3cf8'),(23, '8b3fa97e25805373cbaff2cc4d43d094159f0a8fe7a7e7efd77113e092c7220b'),(24, 'de834aac361be5f84b78b7c38bf065d3cfed58204df2caba8c1027b946ded25b'),(20, '06e1b540b6986dc884d6e2350c10f27b605fa2f18fd3de575b72c01d0aabaf7f'),(26, '4b3177e5b277a9d92f58aa602533faefec3a85097ffca3e44ec294a5e73cfc50'),(27, '204ac3ea3ec0cde9be09c51d5366a83e5b223dfeac3b164a55b602a91ce7a3d0'),(28, 'ed8e9ab0c717c56c01e0196ee11bb5905ea6378b16579c94004c5327127aeb31'),(29, '6b0c736cc7a556e7c5e7435e6745aa432a61133d1fdb92918b42917741615c3e'),(25, '0195f9a7810bbadf5b43905311a5a038e846bd69b688a376a26e296298ec2a04'),(30, '7e9c22c6ac82dc8e0e06c42424fdfde2d1c20df9200ec65a0b31f1fc0008cff9'),(63, '89a9fff17433719aaf71480b93ab8c325ce6fe81f98d38f005f2bfe70902804b'),(32, '248ac01719ed36b01405175c75f2929077f88364693510ef9a81c092d9bcfd9c'),(36, '3aace3cb54fbe05a711d8ba2fc70306627e1af6efed24109875b9fc3a39aa583'),(37, 'b20cdc14d0436d4a03e7c51e04a2b9021dbebe9991cc84e212ca617db62579c6'),(38, 'cf4620fe80f1d9a8bb980d1f3908c237d549b623e16b0b2762410e6913ea933e'),(39, '90ee5fb112f40ae534b638419a57e4b7c375e4e9eb7e08be042aa7948323ed1b'),(40, '0f4e9b78703aec5a466e33829125758218b6399c96450fbd9d98f54223e4a350'),(41, 'ea331ced23c2a12cf0490cbd377a13350d92d5fb7afbdca04b1d70859dac6897'),(42, 'c046f5d2b6f4da24a6ce46a0a20b1990a9f74ec8920f077f30b4444b24584bb7'),(43, '704217a89a688fbc108d853ef887006c49847827e5f006227432f26b0a9aa212'),(44, 'e21ae17e36c86712182f29af1b432f7c91eb9db2b1876ee4c0885fa6fe252f47'),(45, '41e3aa9b0fb2276592bb18f1c6c41b413c5942abc08bf198eddf40cb475ea711'),(46, '6adb293583f6f7431d62ff2f3c2cb265f826fb53c971034a8d32df8dbc85ee57'),(47, '5a9234dad2d2fb897c93f56aa45a60c321c569a298a6df4538793c0f5d808a9b'),(48, 'd26a6259c549ab6b056623d14470da64bfe82e0f7cd425a014574fe2d12cbe4d'),(49, 'b8af1e9588555087d756234761a0d4ea61e53aa279f5432f4f8044ecb44a9d9c'),(53, '59171756fc78053c03ab44cbe510e79629ce919defd2a24dd32b62d0a8127fdc'),(54, '6e359ba460947cf85b921d0685fc33c3b57cdc02359baaba0e3e188c257b11bf'),(55, '223043b20d8b29d38859c54a5383ede7d6873f5fedbda7d33e73f58f78bed235'),(56, '4b19fc7632c184a48a3b7f7451bf123ac308a4275b291a878d48fa23902b7db6'),(57, 'ffc5b5fe63c53687c49ad32a212e3aeca40c0b0c237a5475a6a76b9fbada556e'),(58, 'f21219f41e5a581b56aeb49177fec3cef2f44117c5392830db59a03eb5e7f410'),(31, 'f113aaa4387678d592ccccb59943dcebec9eaa7ec8c50158daf98ea3835ed1a7'),(60, '94fcd6f7361ecfe280b1cd732771d718fd916d5e84362475b6638eab40567f91'),(61, '151e5ebe42ce80742ade7690f99dc11edaf91303e682ad3f8f1e48fd98151434'),(62, '76b87f2c75112befebad936fa8fcd254e3cb076031dc572a8b22826c2224fedc'),(64, 'a3da753eececb8211f07325c2248850ce492947520cb37fc6a0b29dce57f4f48'),(65, 'ceb80efaf0385a97d07941e5fcda5b715283e42bf9154dad2fe0a98290625a43'),(66, '58ff4259869f79f0d48d1e4391d6c163e30f12b6a797f350732b0e39779710bc'),(67, '90af35483a1b27be25e172280de3d1f1b9307a70f6c7c52895a820ce46c1cb37'),(68, 'f940a2ec0321a8536a7614b89c0f0138bda3c9ebc63501b0aa14079f3fa48122'),(69, '82a5119cfe44d5878a41881a0087cac3a6222b64252c0696b2ab84a157b020f8'),(70, '6ce81b81c1190dcf53689cd563e76d118645a745ff3a8da48319388c2be93b80'),(71, 'a691b9df45cc7ec50d5b2f95168f085ab29cbd281c4f2565c7cd5fe2883dc111'),(72, '937a97677a4f4900c004b9fbc62dd39086542c1372279c764d00747d6c77546e'),(73, '71649a7702ac31a1cda970e7ed22d10d78a0c0bdcc14a1f58f8aa0c7e9dd74b0'),(74, '82a4d83afd535340e9b7ee678b4d1fd55d7d580ec0a59ac445119a7e4fcadb34'),(75, '6e7009bd3de5190c267c8b8b4b26a879648ca0a766fc551bcc9a56fc43af6cbf'),(77, '449f380c8c9206a07b94cde0cb375095aecd72b9626032b3ccde2856376c283d'),(78, '8ca155293a4266f832e32be07696f91f9f73a861050270b627650f795e12ca4a'),(79, '00a97ae5cd0102c9198c8d80364f8841bf94922d298ccfc0ce4086e0e765c822'),(80, '1d16396a903ba1f5673d5f7c1b1a95d1988d4cf2b387048ad935eedd0cdef677'),(13, 'cd2e474b3fb0f20ab7db4f8805cecb48d3914929b69cd2133e1232f410028503'),(81, '5b5553a3df38a35a66f8b243e80f9010c7c5d98710c5040ff07afe26ffb5022d'),(76, '3eceb08fde42a61501eec2965d582f4ceed3abb6205d3d72761717340855e0d2'),(82, '0926872043cb02910d78bd9dbe930543146838527839722604a5cd10b04d7d85'),(84, '71320e61db73068f1bd6908ecbf84c073c758f262b74c8020ed3cfb04209b759'),(85, 'dfcb4fb8f1a9aace0cd3baae57e0cb13278d28d843db60cb31c63388e3b3bc4e'),(86, '5609e939561c4d879541b83b2b4adfce6645a774970044cb8cfdc9eb957236bb'),(87, '58a08e6beedba45b008ada2b14e40840252e3337283576beec2975c7a188a6f8'),(88, '6799c474a2e34dac14666a021af28b1822355cf7c002a5dad1d44c5836ed027b'),(90, '1da146b2a46d8c624d16319e1e1a9c53ab80df0d9fb535ea9f255a96e2fcc7cf'),(92, '6abf15ccb4fee791f14c4b2bb9bbebbabbee25e4d618c4030afc5c81c0c950be'),(93, 'c428770a0f6d2b3f441c85c86799236fb688847cc833c6b8ba7a2c992b8e21bc'),(94, '70b380f340ee72d6102640021c0a15e1b1ecab7616dae0176056f4d7eef4a224'),(95, 'ca525183dd72ddbf46312b79bb4c6b1c0e86366abbd69952381ddea9a99f38b6'),(96, '23a9afda09e4cba2189485083fa990fe62ffb5cd9a66ef435f81eea491a1f9d2'),(97, '4944a995405acc45619b16ef32657ee0cefee89a62cf9bd7796f08acffd992df'),(98, 'c4a6c537f25050b3bc10868f66d32323d900aaef85d378c2aed8e821b99328ac'),(83, '9560d86e7d0516a8072f6ec8b51ce2a57983206d52cdae765735a83b4a329293'),(99, '79bcece8c431b6e2c8e63a64fac55935bb126d01275c2dca4fc416c14a8521e0'),(91, '0bed9a76631d745baa74ec50be962a9990c5f22fad490faff2bbd3aac262493f'),(109, 'e04f983786a1443981bbf7ee19458001d106a2a06f483d8165caf8345b6b5d2d'),(104, '30f68257670f80c9a2eb6acb0652e410e5b3710c26579aa70fb85b32acdb024b'),(106, 'aa4f6d51668d247746743d2b13557280f5cc8a45284f911b1021819f74d56f2a'),(110, '4a0246b5bf545539f031fe735121723e89d3807edca1de6ffe99fe759d1cecb8'),(108, 'eacc4fed47609e82641386a47672abe4d4521eff1090893806821a50cc2738a0'),(103, '348fef02eb9c8f155d90d72d008121df3dcc460151ad44540345b74da9ce6228'),(111, '1da79f34aed3ba3d0c93a467ba82929fce457cc5278c8dae5d94fefba0c08382'),(102, '9a4547458d8275e8ea51bb32c7788009265b744ab1515433e12fe29995755ecd'),(101, 'd680fb1d293d58eeb88b7b4464e6c8e22061305bd614de3b0ab5b9507f8011a5'),(100, '6460901bb05b9e0412b1dd526afc64928f723aba3ae56d60a95ead7e957b3bc0'),(112, '8e6eee7504b6cce01da9d7954efcf154398d1cbf57fc99d6b362d581f9907bbb'),(107, '31015b4c4d994b93f1c9906fbb285ca406e683643080dd37de076b2331d7079d'),(121, 'fe6a8d8479dd0f88ed1b41f32b06004d84bcdb5c56834b302a48a758ce72edf6'),(116, '75acb02a4efa0624163f5d6ede84ba031fda529e148d4f6658ecc3e9039d4635'),(117, '5cdc34087d7131491a49d97f23773b57f1918cd8f9e829e5cddf4cfd4d3ac258'),(118, '3d8864f56785e38dded5b5a20074202c3aa9257a026a364502cfb2dcd5632738'),(119, 'f6b81f7d2599cceadc00ee56a5fc6a8ac80e5e04127058778f9aaea89aad5e92'),(105, 'f5c791ec3f4377801bdf89ac08893724fcfe65c7c71a3ce244900fe5dadc6808'),(52, '155aba94d9dbac15e73db0f9c4d3f81e23da2f0bbeed2b509cf3c05ed55f0994'),(50, '316c7efc23ef6f99bb32eb60862d4ed3e03c37fcd95d779dcd99a863fb05ebaa'),(123, '8e43cec3db60b9682c60912c29c76092eaca220886e82d04fa70a27d3986f480'),(124, 'f98f94f63a1dfadd925d30eac417931c0f55e71279f85feab78a83fcb346da69'),(125, 'ce428bb692485e7b9fcfca752ec6badc3a335b0c0081a081dc159fb960cc5763'),(126, '748700682ad6f8082c0680a7f493d45e4f7a00ac79459eaa77297d1cc4aff389'),(127, '6806c9b3c19f20c4b2b57cffeedf2067379362e52702dcf6a9acd25115c99920'),(128, '1db3fbdf7511396f3aa42bb3296672b972c7afbae32ee3f687f6009bda0a2b4f'),(129, '23a0d6745d4f424e0b4115274b6b63c62160974de97cfe0dfb934a89c1cf825c'),(89, '3b001662fd11a7347e5c73a3c03af906cacb88080d3b9f5e4384945907904106'),(130, '8976c4c7c1a0bdc4c1419901dad42c8b8a32feed516154f49c9690306330e833'),(131, 'ff6970a5d1fb2aa9527a8960e42449646b112085dae4c260d33d903f0ca149b0'),(132, '88b2b7bc2119cde16ef3131648500b5875288121451c6a0ae5664ee201f0a0bf'),(133, '3278efb3229b29d9f8e914f97e6ec9bfcc0ae354ed74d170ebf8648329671331'),(136, '413c13f03a57d36628b8a1ceed93e5692bf193bd4244239e317bf1e6ab8cc613'),(137, '40160fe3ae7c681544254b7414b5d02b783c290ffc52b75399c7066c291dd03a'),(138, '390234295ddab6bc68a32dac38a14e8e5179b99b21c2931df7ecd070c82aff40'),(139, '0aa3c06247836728361a1de615d79bd8df2341eba2cddc531d065df7169e4604'),(142, 'd01a286ef439dd815ff3bf19e081be59c3db4cde32e9d7a92ed3842f59111d02'),(143, 'ab1ddc594a9fb66a4345d8d039e6c3b16f6fc15510fc206ef3e3e8673c97c4eb'),(145, 'b0b5d5eacfc5308bd214f03b1b10178e222331506564d045381425891bacb388'),(141, '8c5513d34813c02ebcb34cf60956f314998b6100ad32f32da52765480aaa4317'),(146, '9c376c383a30bf35ea371b6c367f6bb1ee6d73ae92f114d2f1d6f4730cab7d68'),(147, '032fd420bf48faf1bdf9f08d56f04226bb6c2fb5563a4739c2f234a57464e36d'),(148, '5f24bfa1a52193feb6f63a5ef9161dcb14683683899f19be96df2681fb22cd62'),(149, '189d3b4ce7822946ec88a069603b1993f3b5cbe34d6917ec88dd5cf41184ab79'),(152, 'c278d3a98a66a929777d27d5e980861035f883854d223927d37fae7ad7c0336a'),(153, '784ffdf3b94edfee51985f9fbb7922040976e44a22731aa477c93696cb939a27'),(154, 'b5e3c96b53277da76391d2bdee376ffd7b92f234a2901875439db713bec86122'),(155, '62c0264da81d0939ca0bde592620a9b90cd80fc2274ef29e5c28f64d63d8d9c3'),(156, '5f3a90d90984a8db0a44d7100561e904859e2c84baea07340d8a93edfb0f26e4'),(157, 'e8bafe2a878e1163936d9a54087acf0bce1d87a5484dfb260e12917b075c43cc'),(158, 'c33a7e14c31ad1771b457080bfcf5ca21509cc35e78f0f2898bae9254c2f1029'),(159, '891dbaf788128feaf64d11d9b5c40de9b0c5f05a460da04693c6211b114bc7eb'),(160, 'fb946b252e27b80c76e9da4e792725ff67381de65820ea68f01a9a04471d33b4'),(161, '39a26b54517eee25565607b1f0945e56a615312805af28c62e03d74214bf76ac'),(162, '17caf71971ee62c04cfac608fa9b0087f401e85b4f466b6f7d658802c8c80d0b'),(163, 'cb06301ed12a4442edb550b4ef336fe728bdb6593b868869574ac1e8666f422f'),(164, '191d367f22e229fb68817fad904db7651f370bccdfc175785a65f6daed90a219'),(165, '0822a14e730a3482d09af17cdea3d08a32cf24171f9ef4ffa23cfe5d6b7f9058'),(166, '5a1aab5123279f45db68e18c868483feb7b76b30d17af1b2680c4d88df7bd19f'),(167, '68399e3324c3510a4a6ac00d14a8e4b216094820fd9db9aa3a5c9f706dbf3ca3'),(174, 'ececd057cb4779cef52823083ec9c82961f3e8539190309aaf6bcf2e3a8bafb5'),(176, 'bc2c79132216e7d1a42d6a9792acf5273019bbc5f278fc3805c1356a1f02c1be'),(175, 'b400cbf0a846207e836229eca5667a963fbf690cce6db1f7c5eb1d8a77748c52'),(180, '9b4aba0ea051d5b0c122f5537c9c4094a90200d64927fb35e8f8b3ceb196a292'),(177, '3fed26fe66f5998ba29b91492cc7c14d786c6e93c9140b7a197c77fe1491d7ef'),(181, 'f8da30602603aac15013c16a7546c664a56c18b688d9ceb91f36cf73fb4e64fc'),(182, 'ad716eb41bbd9c20ccc843ce36d4556e180e65c615265d94bd601b9d3a00a9af'),(19, '374cc731fe422a43fc19262c6b52073139fcb32458e5151cd72ce7bf3b6e8e14'),(183, 'bc983f1b189100539bc9902a724f36690c7a0fde2e475acf36ca51caa768ab15'),(185, 'c92b5cb90377b0be5814df22b255860d7d6dd72e35bbde17410fbb4024836ec2'),(184, 'f0d266a770ca3af521e9a265de4f68ce9f23e93264967d82dee3e5667e9897cb'),(186, '110764f28095409fa7cc60d3fedaa648bc022b965d5170710c0c8393074a0195'),(187, '9a1414da05503812b30dd892c9d60b1d6afced61557450db206cd02316917ba1'),(188, '1bb14f4d8a5b64de886e7b78a3a3da304ae58901464ab586722dd5f84883206d'),(114, '52da7e00af315c442deb72a64749dfd96d8992bb148c5ea02ae3390d14e48270'),(115, 'd88c5bd0d4bbc624757a97b428b9f0004aacb9357c88b9b2a2079bdb90d207a3'),(189, '6b06da56ee416217ec12cb1b35a866a3610abaec3c6b23ad816357157bbcf650'),(190, '9b4a938e3710df3ad63ffce079464156d017254868344a09572a9a573f6c3e29'),(191, '0ee17ec8d7cf979b35b707b7cce870a3c56ff326368f17dfb31019bdcb9d10d7'),(192, 'e66fede9824574d4377015fe5a7c532ef40eb6dc31873a709891b8b9a39c45d1'),(193, '9ef2bc040e794fbafbc333406144064206254f5c62074f2c8882c29e57a789ee'),(194, '061e60ddf7b8c0af5672644ef84bb0011b8ab9510b9ef1b88546a07b9a14bad4')) AS data(id, token_hash)\nWHERE email_tokens.id = data.id\n")
   -> 0.0025s
-- change_column_null(:email_tokens, :token_hash, false, nil)
   -> 0.0003s
== 20210929215543 AddTokenHashToEmailToken: migrated (0.0055s) ================

== 20210930144333 AddChatEnabledToUserOptions: migrating ======================
-- add_column(:user_options, :chat_enabled, :boolean, {:default=>true, :null=>false})
   -> 0.0007s
== 20210930144333 AddChatEnabledToUserOptions: migrated (0.0011s) =============

== 20211005163152 AddScopeToEmailToken: migrating =============================
-- add_column(:email_tokens, :scope, :integer)
   -> 0.0004s
== 20211005163152 AddScopeToEmailToken: migrated (0.0014s) ====================

== 20211013092406 AddNormalizedEmailToUserEmail: migrating ====================
-- add_column(:user_emails, :normalized_email, :string)
   -> 0.0003s
-- execute("CREATE INDEX index_user_emails_on_normalized_email ON user_emails (LOWER(normalized_email))")
   -> 0.0035s
== 20211013092406 AddNormalizedEmailToUserEmail: migrated (0.0043s) ===========

== 20211015092047 AddsAutomationIdsIndexToPostCustomFields: migrating =========
-- add_index(:post_custom_fields, [:post_id, :value], {:unique=>true, :where=>"name = 'discourse_automation_ids'", :name=>:idx_post_custom_fields_discourse_automation_unique_id_partial})
   -> 0.0046s
== 20211015092047 AddsAutomationIdsIndexToPostCustomFields: migrated (0.0050s) 

== 20211015092048 MakeDiscourseAutomationIdAnArrayOnTopicCustomFields: migrating 
-- add_index(:topic_custom_fields, [:topic_id, :value], {:unique=>true, :where=>"name = 'discourse_automation_ids'", :name=>:idx_topic_custom_fields_discourse_automation_unique_id_partial})
   -> 0.0044s
== 20211015092048 MakeDiscourseAutomationIdAnArrayOnTopicCustomFields: migrated (0.0058s) 

== 20211015092049 AddsAutomationIdsIndexToUserCustomFields: migrating =========
-- add_index(:user_custom_fields, [:user_id, :value], {:unique=>true, :where=>"name = 'discourse_automation_ids'", :name=>:idx_user_custom_fields_discourse_automation_unique_id_partial})
   -> 0.0043s
== 20211015092049 AddsAutomationIdsIndexToUserCustomFields: migrated (0.0047s) 

== 20211018234219 RemoveEnableExperimentalImageUploaderSiteSetting: migrating =
-- execute("DELETE FROM site_settings\nWHERE name = 'enable_experimental_image_uploader'\n")
   -> 0.0002s
== 20211018234219 RemoveEnableExperimentalImageUploaderSiteSetting: migrated (0.0006s) 

== 20211019092048 RemoveCrawlImagesSiteSetting: migrating =====================
-- execute("DELETE\nFROM site_settings\nWHERE name = 'crawl_images';\n")
   -> 0.0002s
== 20211019092048 RemoveCrawlImagesSiteSetting: migrated (0.0005s) ============

== 20211019152356 PopulatePendingPostsCountColumn: migrating ==================
-- execute("WITH to_update AS (\n  SELECT COUNT(id) AS posts, created_by_id\n  FROM reviewables\n  WHERE type = 'ReviewableQueuedPost'\n    AND status = 0\n  GROUP BY created_by_id\n)\nUPDATE user_stats\nSET pending_posts_count = to_update.posts\nFROM to_update\nWHERE to_update.created_by_id = user_stats.user_id\n")
   -> 0.0006s
== 20211019152356 PopulatePendingPostsCountColumn: migrated (0.0025s) =========

== 20211022151713 CreateChatMessagePostConnections: migrating =================
-- create_table(:chat_message_post_connections)
   -> 0.0040s
-- add_index(:chat_message_post_connections, [:post_id, :chat_message_id], {:unique=>true, :name=>"chat_message_post_connections_index"})
   -> 0.0027s
== 20211022151713 CreateChatMessagePostConnections: migrated (0.0072s) ========

== 20211029145508 AddChatIsolatedToUserOptions: migrating =====================
-- add_column(:user_options, :chat_isolated, :boolean, {:null=>true})
   -> 0.0004s
== 20211029145508 AddChatIsolatedToUserOptions: migrated (0.0008s) ============

== 20211104141254 AddOnlyChatPushNotificationsToUserOptions: migrating ========
-- add_column(:user_options, :only_chat_push_notifications, :boolean, {:null=>true})
   -> 0.0003s
== 20211104141254 AddOnlyChatPushNotificationsToUserOptions: migrated (0.0007s) 

== 20211106085344 CreateAssociatedGroups: migrating ===========================
-- create_table(:associated_groups)
   -> 0.0067s
-- add_index(:associated_groups, [:provider_name, :provider_id], {:unique=>true, :name=>"associated_groups_provider_id"})
   -> 0.0026s
== 20211106085344 CreateAssociatedGroups: migrated (0.0098s) ==================

== 20211106085527 CreateUserAssociatedGroups: migrating =======================
-- create_table(:user_associated_groups)
   -> 0.0090s
-- add_index(:user_associated_groups, [:user_id, :associated_group_id], {:unique=>true, :name=>"index_user_associated_groups"})
   -> 0.0026s
== 20211106085527 CreateUserAssociatedGroups: migrated (0.0127s) ==============

== 20211106085605 CreateGroupAssociatedGroups: migrating ======================
-- create_table(:group_associated_groups)
   -> 0.0088s
-- add_index(:group_associated_groups, [:group_id, :associated_group_id], {:unique=>true, :name=>"index_group_associated_groups"})
   -> 0.0027s
== 20211106085605 CreateGroupAssociatedGroups: migrated (0.0121s) =============

== 20211116225901 AddDescriptionToTags: migrating =============================
-- add_column(:tags, :description, :string)
   -> 0.0004s
== 20211116225901 AddDescriptionToTags: migrated (0.0008s) ====================

== 20211119103353 AddsDiscourseAutomationUserGlobalNotice: migrating ==========
-- create_table(:discourse_automation_user_global_notices)
   -> 0.0072s
-- add_index(:discourse_automation_user_global_notices, [:user_id, :identifier], {:unique=>true, :name=>:idx_discourse_automation_user_global_notices})
   -> 0.0030s
== 20211119103353 AddsDiscourseAutomationUserGlobalNotice: migrated (0.0108s) =

== 20211119142000 AddCookedToChatMessages: migrating ==========================
-- add_column(:chat_messages, :cooked, :text)
   -> 0.0004s
-- add_column(:chat_messages, :cooked_version, :integer)
   -> 0.0003s
== 20211119142000 AddCookedToChatMessages: migrated (0.0011s) =================

== 20211123033311 ResetFirstUnreadPmAtOnUserStat: migrating ===================
-- execute("UPDATE user_stats us\nSET first_unread_pm_at = u.created_at\nFROM users u\nWHERE u.id = us.user_id\n")
   -> 0.0011s
== 20211123033311 ResetFirstUnreadPmAtOnUserStat: migrated (0.0015s) ==========

== 20211123144714 AddRecentSearches: migrating ================================
-- add_column(:user_options, :oldest_search_log_date, :timestamp, {:precision=>nil})
   -> 0.0008s
-- add_index(:search_logs, [:user_id, :created_at], {:where=>"user_id IS NOT NULL", :name=>"index_search_logs_on_user_id_and_created_at"})
   -> 0.0047s
== 20211123144714 AddRecentSearches: migrated (0.0060s) =======================

== 20211124161346 QueueInternalOneboxRebake: migrating ========================
== 20211124161346 QueueInternalOneboxRebake: migrated (0.0004s) ===============

== 20211129171229 CreateChatUploads: migrating ================================
-- create_table(:chat_uploads)
   -> 0.0037s
-- add_index(:chat_uploads, [:chat_message_id, :upload_id], {:unique=>true, :name=>"index_chat_uploads_on_chat_message_id_and_upload_id"})
   -> 0.0029s
== 20211129171229 CreateChatUploads: migrated (0.0071s) =======================

== 20211201171813 CreateChatReactions: migrating ==============================
-- create_table(:chat_message_reactions)
   -> 0.0065s
-- add_index(:chat_message_reactions, [:chat_message_id, :user_id, :emoji], {:unique=>true, :name=>:chat_message_reactions_index})
   -> 0.0028s
== 20211201171813 CreateChatReactions: migrated (0.0099s) =====================

== 20211201221028 MigrateEmailToNormalizedEmail: migrating ====================
-- execute("UPDATE user_emails\nSET normalized_email = REPLACE(REGEXP_REPLACE(email,'([+@].*)',''),'.','') || REGEXP_REPLACE(email, '[^@]*', '')\nWHERE (normalized_email IS NULL OR normalized_email <> (REPLACE(REGEXP_REPLACE(email,'([+@].*)',''),'.','') || REGEXP_REPLACE(email, '[^@]*', '')))\n  AND (id >= -2 AND id < 156)\n")
   -> 0.0026s
== 20211201221028 MigrateEmailToNormalizedEmail: migrated (0.0043s) ===========

== 20211206160211 CreateIndexOnEmailTokensTokenHash: migrating ================
-- add_index(:email_tokens, :token_hash, {:unique=>true, :name=>"index_email_tokens_on_token_hash"})
   -> 0.0031s
== 20211206160211 CreateIndexOnEmailTokensTokenHash: migrated (0.0037s) =======

== 20211206160212 DropTokenFromEmailTokens: migrating =========================
== 20211206160212 DropTokenFromEmailTokens: migrated (0.0016s) ================

== 20211207130646 AddDomainToInvites: migrating ===============================
-- add_column(:invites, :domain, :string)
   -> 0.0005s
== 20211207130646 AddDomainToInvites: migrated (0.0013s) ======================

== 20211210191830 CreateChatMentions: migrating ===============================
-- create_table(:chat_mentions)
   -> 0.0042s
-- add_index(:chat_mentions, [:chat_message_id, :user_id, :notification_id], {:unique=>true, :name=>"chat_mentions_index"})
   -> 0.0031s
== 20211210191830 CreateChatMentions: migrated (0.0079s) ======================

== 20211213060445 EmailTokensTokenToNullable: migrating =======================
== 20211213060445 EmailTokensTokenToNullable: migrated (0.0023s) ==============

== 20211213150607 AddChatSoundToUserOptions: migrating ========================
-- add_column(:user_options, :chat_sound, :string, {:null=>true})
   -> 0.0005s
== 20211213150607 AddChatSoundToUserOptions: migrated (0.0008s) ===============

== 20211216191224 RemoveAdvancedEditorPreviewSiteSetting: migrating ===========
-- execute("DELETE FROM site_settings WHERE name = 'enable_advanced_editor_preview_sync'")
   -> 0.0002s
== 20211216191224 RemoveAdvancedEditorPreviewSiteSetting: migrated (0.0005s) ==

== 20211217221026 AddNameToChatChannel: migrating =============================
-- add_column(:chat_channels, :name, :string, {:null=>true})
   -> 0.0003s
== 20211217221026 AddNameToChatChannel: migrated (0.0007s) ====================

== 20211220023034 RemoveExperimentalBackupUploaderSetting: migrating ==========
-- execute("DELETE FROM site_settings\nWHERE name = 'enable_experimental_backup_uploader'\n")
   -> 0.0002s
== 20211220023034 RemoveExperimentalBackupUploaderSetting: migrated (0.0005s) =

== 20211221164540 RemoveLimitForFancyTitleInTopics: migrating =================
-- change_column(:topics, :fancy_title, :string, {:limit=>nil})
   -> 0.0004s
== 20211221164540 RemoveLimitForFancyTitleInTopics: migrated (0.0008s) ========

== 20211222153716 AddDescriptionToChatChannels: migrating =====================
-- add_column(:chat_channels, :description, :text, {:null=>true})
   -> 0.0003s
== 20211222153716 AddDescriptionToChatChannels: migrated (0.0007s) ============

== 20211224010204 DropOldBookmarkColumns: migrating ===========================
== 20211224010204 DropOldBookmarkColumns: migrated (0.0024s) ==================

== 20211224011511 DeleteExperimentalComposerUploadSetting: migrating ==========
-- execute("DELETE FROM site_settings WHERE name = 'enable_experimental_composer_uploader'")
   -> 0.0003s
== 20211224011511 DeleteExperimentalComposerUploadSetting: migrated (0.0008s) =

== 20211224111749 NotNullNotificationLevelInCategoryUsers: migrating ==========
-- execute("DELETE FROM category_users WHERE notification_level IS NULL")
   -> 0.0002s
-- change_column_null(:category_users, :notification_level, false, nil)
   -> 0.0003s
== 20211224111749 NotNullNotificationLevelInCategoryUsers: migrated (0.0008s) =

== 20220104051326 ChangeChatChannelsTimestampColumnsToTimestampType: migrating 
-- change_column_default(:chat_channels, :created_at, nil)
   -> 0.0016s
-- change_column_default(:chat_channels, :updated_at, nil)
   -> 0.0012s
-- column_exists?(:chat_channels, :created_at, :timestamp)
   -> 0.0011s
-- change_column(:chat_channels, :created_at, :timestamp)
   -> 0.0003s
-- column_exists?(:chat_channels, :updated_at, :timestamp)
   -> 0.0010s
-- change_column(:chat_channels, :updated_at, :timestamp)
   -> 0.0003s
== 20220104051326 ChangeChatChannelsTimestampColumnsToTimestampType: migrated (0.0060s) 

== 20220105024605 AddTriggerForPolymorphicBookmarkColumnsToSyncData: migrating 
== 20220105024605 AddTriggerForPolymorphicBookmarkColumnsToSyncData: migrated (0.0005s) 

== 20220118065658 AddConstraintsToUserStat: migrating =========================
-- execute("UPDATE user_stats\nSET post_count = 0\nWHERE post_count < 0\n")
   -> 0.0002s
-- execute("UPDATE user_stats\nSET topic_count = 0\nWHERE topic_count < 0\n")
   -> 0.0001s
-- execute("ALTER TABLE user_stats ADD CONSTRAINT topic_count_positive CHECK (topic_count >= 0)")
   -> 0.0004s
-- execute("ALTER TABLE user_stats ADD CONSTRAINT post_count_positive CHECK (post_count >= 0)")
   -> 0.0003s
== 20220118065658 AddConstraintsToUserStat: migrated (0.0014s) ================

== 20220119170535 AddChatRetentionFieldsToUserOptions: migrating ==============
-- add_column(:user_options, :dismissed_channel_retention_reminder, :boolean, {:null=>true})
   -> 0.0004s
-- add_column(:user_options, :dismissed_dm_retention_reminder, :boolean, {:null=>true})
   -> 0.0002s
== 20220119170535 AddChatRetentionFieldsToUserOptions: migrated (0.0010s) =====

== 20220124003259 AddEmailFromAliasToGroups: migrating ========================
-- add_column(:groups, :email_from_alias, :string, {:null=>true})
   -> 0.0003s
== 20220124003259 AddEmailFromAliasToGroups: migrated (0.0007s) ===============

== 20220125052845 FixTopicLikeCountIncludingWhispers: migrating ===============
== 20220125052845 FixTopicLikeCountIncludingWhispers: migrated (0.0016s) ======

== 20220126052157 ChangeSegmentCjkSiteSetting: migrating ======================
-- execute("UPDATE site_settings\nSET name = 'search_tokenize_chinese'\nWHERE name = 'search_tokenize_chinese_japanese_korean'\n")
   -> 0.0002s
-- execute("DELETE FROM site_settings\nWHERE name = 'search_tokenize_chinese_japanese_korean'\n")
   -> 0.0001s
== 20220126052157 ChangeSegmentCjkSiteSetting: migrated (0.0007s) =============

== 20220130192155 SetUseEmailForUsernameAndNameSuggestionsOnExistingSites: migrating 
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('use_email_for_username_and_name_suggestions', 5, 't', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0002s
== 20220130192155 SetUseEmailForUsernameAndNameSuggestionsOnExistingSites: migrated (0.0010s) 

== 20220202223955 MigrateSelectableAvatarsEnabled: migrating ==================
-- execute("UPDATE site_settings AS s\n  SET value =\n    CASE WHEN t.value = 't' THEN 'no_one'\n    ELSE 'disabled'\n    END,\n  data_type = 7,\n  name = 'selectable_avatars_mode'\n  FROM site_settings t\n  WHERE s.id = t.id AND s.name = 'selectable_avatars_enabled'\n")
   -> 0.0003s
== 20220202223955 MigrateSelectableAvatarsEnabled: migrated (0.0006s) =========

== 20220202225716 AddExternalIdToTopics: migrating ============================
-- add_column(:topics, :external_id, :string, {:null=>true})
   -> 0.0004s
-- add_index(:topics, :external_id, {:unique=>true, :where=>"external_id IS NOT NULL", :name=>"index_topics_on_external_id"})
   -> 0.0067s
== 20220202225716 AddExternalIdToTopics: migrated (0.0077s) ===================

== 20220203204002 CreateChatDraftsTable: migrating ============================
-- create_table(:chat_drafts)
   -> 0.0065s
== 20220203204002 CreateChatDraftsTable: migrated (0.0070s) ===================

== 20220203204003 MigrateDraftsToChatDrafts: migrating ========================
-- execute("INSERT INTO chat_drafts(user_id, chat_channel_id, data, created_at, updated_at)\nSELECT user_id, SUBSTRING(draft_key, LENGTH('chat_') + 1)::integer chat_channel_id, data, created_at, updated_at\nFROM drafts\nWHERE draft_key LIKE 'chat_%'\n")
   -> 0.0005s
-- execute("DELETE FROM drafts\nWHERE draft_key LIKE 'chat_%'\n")
   -> 0.0001s
== 20220203204003 MigrateDraftsToChatDrafts: migrated (0.0010s) ===============

== 20220209210449 AddBookmarkAutoDeletePreferenceToUserOption: migrating ======
-- add_column(:user_options, :bookmark_auto_delete_preference, :integer, {:default=>3, :null=>false})
   -> 0.0006s
== 20220209210449 AddBookmarkAutoDeletePreferenceToUserOption: migrated (0.0010s) 

== 20220214224506 ResetCustomEmojiPostBakesVersionSecureFix: migrating ========
== 20220214224506 ResetCustomEmojiPostBakesVersionSecureFix: migrated (0.0005s) 

== 20220214233625 AddBounceErrorCodeToEmailLog: migrating =====================
-- add_column(:email_logs, :bounce_error_code, :string, {:null=>true})
   -> 0.0004s
== 20220214233625 AddBounceErrorCodeToEmailLog: migrated (0.0007s) ============

== 20220215015538 DropUserStatCountConstraints: migrating =====================
-- execute("ALTER TABLE user_stats DROP CONSTRAINT topic_count_positive")
   -> 0.0003s
-- execute("ALTER TABLE user_stats DROP CONSTRAINT post_count_positive")
   -> 0.0002s
== 20220215015538 DropUserStatCountConstraints: migrated (0.0008s) ============

== 20220218023859 AddStatusToChatChannel: migrating ===========================
-- add_column(:chat_channels, :status, :integer, {:default=>0, :null=>false})
   -> 0.0007s
-- add_index(:chat_channels, :status, {:name=>"index_chat_channels_on_status"})
   -> 0.0031s
== 20220218023859 AddStatusToChatChannel: migrated (0.0044s) ==================

== 20220220234155 ConformBounceErrorCode: migrating ===========================
== 20220220234155 ConformBounceErrorCode: migrated (0.0008s) ==================

== 20220228051724 CreateChatChannelArchiveTable: migrating ====================
-- create_table(:chat_channel_archives)
   -> 0.0067s
-- add_index(:chat_channel_archives, :chat_channel_id, {:name=>"index_chat_channel_archives_on_chat_channel_id"})
   -> 0.0028s
== 20220228051724 CreateChatChannelArchiveTable: migrated (0.0100s) ===========

== 20220302163246 UpdateAvatarServiceDomain: migrating ========================
== 20220302163246 UpdateAvatarServiceDomain: migrated (0.0006s) ===============

== 20220302171443 RebakeOldAvatarServiceUrls: migrating =======================
== 20220302171443 RebakeOldAvatarServiceUrls: migrated (0.0011s) ==============

== 20220304162250 EnableUnaccentExtension: migrating ==========================
-- enable_extension("unaccent")
   -> 0.0033s
== 20220304162250 EnableUnaccentExtension: migrated (0.0038s) =================

== 20220308165620 AddUserCountToChatChannel: migrating ========================
-- add_column(:chat_channels, :user_count, :integer, {:null=>true, :default=>0})
   -> 0.0006s
-- change_column_null(:chat_channels, :user_count, false, nil)
   -> 0.0002s
== 20220308165620 AddUserCountToChatChannel: migrated (0.0012s) ===============

== 20220308201942 CreateUploadReferences: migrating ===========================
-- create_table(:upload_references)
   -> 0.0119s
-- add_index(:upload_references, [:upload_id, :target_type, :target_id], {:unique=>true, :name=>"index_upload_references_on_upload_and_target"})
   -> 0.0022s
== 20220308201942 CreateUploadReferences: migrated (0.0147s) ==================

== 20220309132719 CopyPostUploadsToUploadReferences: migrating ================
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT post_uploads.upload_id, 'Post', post_uploads.post_id, uploads.created_at, uploads.updated_at\nFROM post_uploads\nJOIN uploads ON uploads.id = post_uploads.upload_id\nON CONFLICT DO NOTHING\n")
   -> 0.0014s
== 20220309132719 CopyPostUploadsToUploadReferences: migrated (0.0018s) =======

== 20220309132720 CopyPostUploadsToUploadReferencesForSync: migrating =========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT upload_id, 'Post', post_id, NOW(), NOW()\nFROM post_uploads\nON CONFLICT DO NOTHING\n")
   -> 0.0004s
== 20220309132720 CopyPostUploadsToUploadReferencesForSync: migrated (0.0008s) 

== 20220309174820 AddLastMessageCreatedAtToChatChannels: migrating ============
-- add_column(:chat_channels, :last_message_sent_at, :timestamp, {:default=>#<Proc:0x0000fb5cceada2b0 /var/www/discourse/plugins/chat/db/migrate/20220309174820_add_last_message_created_at_to_chat_channels.rb:4 (lambda)>, :precision=>nil})
   -> 0.0005s
-- change_column_null(:chat_channels, :last_message_sent_at, false, nil)
   -> 0.0002s
== 20220309174820 AddLastMessageCreatedAtToChatChannels: migrated (0.0012s) ===

== 20220316150247 ResetBookmarksReminderLastSentAt: migrating =================
== 20220316150247 ResetBookmarksReminderLastSentAt: migrated (0.0007s) ========

== 20220321235638 DropChatMessagePostConnectionsTable: migrating ==============
== 20220321235638 DropChatMessagePostConnectionsTable: migrated (0.0016s) =====

== 20220322024216 AddBookmarkPolymorphicColumns: migrating ====================
-- column_exists?(:bookmarks, :bookmarkable_id)
   -> 0.0015s
-- add_column(:bookmarks, :bookmarkable_id, :integer)
   -> 0.0005s
-- column_exists?(:bookmarks, :bookmarkable_type)
   -> 0.0011s
-- add_column(:bookmarks, :bookmarkable_type, :string)
   -> 0.0037s
-- index_exists?(:bookmarks, [:user_id, :bookmarkable_type, :bookmarkable_id])
   -> 0.0024s
-- add_index(:bookmarks, [:user_id, :bookmarkable_type, :bookmarkable_id], {:name=>"idx_bookmarks_user_polymorphic_unique", :unique=>true})
   -> 0.0029s
== 20220322024216 AddBookmarkPolymorphicColumns: migrated (0.0129s) ===========

== 20220323141645 RemovePollingSiteSettings: migrating ========================
-- execute("DELETE FROM site_settings WHERE name = 'enable_long_polling'")
   -> 0.0002s
-- execute("DELETE FROM site_settings WHERE name = 'long_polling_interval'")
   -> 0.0001s
== 20220323141645 RemovePollingSiteSettings: migrated (0.0007s) ===============

== 20220324062937 IgnoreChannelWideMentionToUserOptions: migrating ============
-- add_column(:user_options, :ignore_channel_wide_mention, :boolean, {:null=>true})
   -> 0.0005s
== 20220324062937 IgnoreChannelWideMentionToUserOptions: migrated (0.0009s) ===

== 20220325064954 MakeSomeBookmarkColumnsNullable: migrating ==================
-- change_column_null(:bookmarks, :post_id, true, nil)
   -> 0.0002s
-- execute("ALTER TABLE bookmarks ADD CONSTRAINT enforce_post_id_or_bookmarkable CHECK (\n      (post_id IS NOT NULL) OR (bookmarkable_id IS NOT NULL AND bookmarkable_type IS NOT NULL)\n    )")
   -> 0.0003s
== 20220325064954 MakeSomeBookmarkColumnsNullable: migrated (0.0009s) =========

== 20220328142120 CreateUserChatMessageStatuses: migrating ====================
-- create_table(:chat_message_email_statuses)
   -> 0.0040s
-- add_index(:chat_message_email_statuses, [:user_id, :chat_message_id], {:name=>"chat_message_email_status_user_message_index"})
   -> 0.0025s
-- add_index(:chat_message_email_statuses, :status, {:name=>"index_chat_message_email_statuses_on_status"})
   -> 0.0023s
-- add_column(:user_options, :chat_email_frequency, :integer, {:default=>1, :null=>false})
   -> 0.0008s
-- add_column(:user_options, :last_emailed_for_chat, :timestamp, {:null=>true, :precision=>nil})
   -> 0.0003s
== 20220328142120 CreateUserChatMessageStatuses: migrated (0.0106s) ===========

== 20220330160740 CleanupSelectableAvatarsData: migrating =====================
-- execute("DELETE FROM site_settings\nWHERE name = 'selectable_avatars_urls'\n")
   -> 0.0002s
== 20220330160740 CleanupSelectableAvatarsData: migrated (0.0006s) ============

== 20220330160747 CopySiteSettingsUploadsToUploadReferences: migrating ========
-- execute("WITH site_settings_uploads AS (\n  SELECT id, raw_upload_id::integer AS upload_id\n  FROM (\n    SELECT id, unnest(string_to_array(value, '|')) AS raw_upload_id\n    FROM site_settings\n    WHERE data_type = 17\n  ) raw\n  WHERE raw_upload_id ~ '^d+$'\n  UNION\n  SELECT id, value::integer\n  FROM site_settings\n  WHERE data_type = 18 AND value != ''\n)\nINSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT site_settings_uploads.upload_id, 'SiteSetting', site_settings_uploads.id, uploads.created_at, uploads.updated_at\nFROM site_settings_uploads\nJOIN uploads ON uploads.id = site_settings_uploads.upload_id\nON CONFLICT DO NOTHING\n")
   -> 0.0009s
== 20220330160747 CopySiteSettingsUploadsToUploadReferences: migrated (0.0013s) 

== 20220330160751 CopyBadgesUploadsToUploadReferences: migrating ==============
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT badges.image_upload_id, 'Badge', badges.id, uploads.created_at, uploads.updated_at\nFROM badges\nJOIN uploads ON uploads.id = badges.image_upload_id\nWHERE badges.image_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0004s
== 20220330160751 CopyBadgesUploadsToUploadReferences: migrated (0.0008s) =====

== 20220330160754 CopyGroupsUploadsToUploadReferences: migrating ==============
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT groups.flair_upload_id, 'Group', groups.id, uploads.created_at, uploads.updated_at\nFROM groups\nJOIN uploads ON uploads.id = groups.flair_upload_id\nWHERE groups.flair_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0005s
== 20220330160754 CopyGroupsUploadsToUploadReferences: migrated (0.0009s) =====

== 20220330160757 CopyUserExportsUploadsToUploadReferences: migrating =========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_exports.upload_id, 'UserExport', user_exports.id, uploads.created_at, uploads.updated_at\nFROM user_exports\nJOIN uploads ON uploads.id = user_exports.upload_id\nON CONFLICT DO NOTHING\n")
   -> 0.0005s
== 20220330160757 CopyUserExportsUploadsToUploadReferences: migrated (0.0008s) 

== 20220330164740 CopyThemeFieldsUploadsToUploadReferences: migrating =========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT theme_fields.upload_id, 'ThemeField', theme_fields.id, uploads.created_at, uploads.updated_at\nFROM theme_fields\nJOIN uploads ON uploads.id = theme_fields.upload_id\nWHERE type_id = 2\nON CONFLICT DO NOTHING\n")
   -> 0.0005s
== 20220330164740 CopyThemeFieldsUploadsToUploadReferences: migrated (0.0008s) 

== 20220331204447 CreateSitemapsTable: migrating ==============================
-- create_table(:sitemaps, {:if_not_exists=>true})
   -> 0.0061s
-- add_index(:sitemaps, :name, {:unique=>true, :if_not_exists=>true, :name=>"index_sitemaps_on_name"})
   -> 0.0023s
== 20220331204447 CreateSitemapsTable: migrated (0.0090s) =====================

== 20220401130745 CreateCategoryRequiredTagGroups: migrating ==================
-- create_table(:category_required_tag_groups)
   -> 0.0038s
-- add_index(:category_required_tag_groups, [:category_id, :tag_group_id], {:name=>"idx_category_required_tag_groups", :unique=>true})
   -> 0.0024s
-- execute("INSERT INTO category_required_tag_groups\n(category_id, tag_group_id, min_count, updated_at, created_at)\nSELECT c.id, c.required_tag_group_id, c.min_tags_from_required_group, NOW(), NOW()\nFROM categories c\nINNER JOIN tag_groups tg ON tg.id = c.required_tag_group_id\nWHERE tg.id IS NOT NULL\n")
   -> 0.0007s
== 20220401130745 CreateCategoryRequiredTagGroups: migrated (0.0076s) =========

== 20220401140745 DropCategoryRequiredTagGroupColumns: migrating ==============
== 20220401140745 DropCategoryRequiredTagGroupColumns: migrated (0.0026s) =====

== 20220404195635 CopyCategoriesUploadsToUploadReferences: migrating ==========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT categories.uploaded_logo_id, 'Category', categories.id, uploads.created_at, uploads.updated_at\nFROM categories\nJOIN uploads ON uploads.id = categories.uploaded_logo_id\nWHERE categories.uploaded_logo_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0006s
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT categories.uploaded_background_id, 'Category', categories.id, uploads.created_at, uploads.updated_at\nFROM categories\nJOIN uploads ON uploads.id = categories.uploaded_background_id\nWHERE categories.uploaded_background_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0004s
== 20220404195635 CopyCategoriesUploadsToUploadReferences: migrated (0.0014s) =

== 20220404201949 CopyCustomEmojisUploadsToUploadReferences: migrating ========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT custom_emojis.upload_id, 'CustomEmoji', custom_emojis.id, uploads.created_at, uploads.updated_at\nFROM custom_emojis\nJOIN uploads ON uploads.id = custom_emojis.upload_id\nWHERE custom_emojis.upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0006s
== 20220404201949 CopyCustomEmojisUploadsToUploadReferences: migrated (0.0009s) 

== 20220404203356 CopyUserProfilesUploadsToUploadReferences: migrating ========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_profiles.profile_background_upload_id, 'UserProfile', user_profiles.user_id, uploads.created_at, uploads.updated_at\nFROM user_profiles\nJOIN uploads ON uploads.id = user_profiles.profile_background_upload_id\nWHERE user_profiles.profile_background_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0007s
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_profiles.card_background_upload_id, 'UserProfile', user_profiles.user_id, uploads.created_at, uploads.updated_at\nFROM user_profiles\nJOIN uploads ON uploads.id = user_profiles.card_background_upload_id\nWHERE user_profiles.card_background_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0004s
== 20220404203356 CopyUserProfilesUploadsToUploadReferences: migrated (0.0015s) 

== 20220404204439 CopyUserAvatarsUploadsToUploadReferences: migrating =========
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_avatars.custom_upload_id, 'UserAvatar', user_avatars.id, uploads.created_at, uploads.updated_at\nFROM user_avatars\nJOIN uploads ON uploads.id = user_avatars.custom_upload_id\nWHERE user_avatars.custom_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0007s
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT user_avatars.gravatar_upload_id, 'UserAvatar', user_avatars.id, uploads.created_at, uploads.updated_at\nFROM user_avatars\nJOIN uploads ON uploads.id = user_avatars.gravatar_upload_id\nWHERE user_avatars.gravatar_upload_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0004s
== 20220404204439 CopyUserAvatarsUploadsToUploadReferences: migrated (0.0015s) 

== 20220404212716 CopyThemeSettingsUploadsToUploadReferences: migrating =======
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT theme_settings.value::int, 'ThemeSetting', theme_settings.id, uploads.created_at, uploads.updated_at\nFROM theme_settings\nJOIN uploads ON uploads.id = theme_settings.value::int\nWHERE data_type = 6 AND theme_settings.value IS NOT NULL AND theme_settings.value != ''\nON CONFLICT DO NOTHING\n")
   -> 0.0004s
== 20220404212716 CopyThemeSettingsUploadsToUploadReferences: migrated (0.0007s) 

== 20220407195246 RemoveCategoryRequiredTagGroupsWithoutTagGroups: migrating ==
-- execute("DELETE FROM category_required_tag_groups\nWHERE id IN (\n  SELECT crtg.id\n  FROM category_required_tag_groups crtg\n  LEFT OUTER JOIN tag_groups tg ON crtg.tag_group_id = tg.id\n  WHERE tg.id IS NULL\n)\n")
   -> 0.0005s
== 20220407195246 RemoveCategoryRequiredTagGroupsWithoutTagGroups: migrated (0.0009s) 

== 20220419124720 ConvertRecurrenceToCustomField: migrating ===================
== 20220419124720 ConvertRecurrenceToCustomField: migrated (0.0004s) ==========

== 20220428025825 AddEnableExperimentalSidebarToUserOptions: migrating ========
-- add_column(:user_options, :enable_experimental_sidebar, :boolean, {:default=>false})
   -> 0.0008s
== 20220428025825 AddEnableExperimentalSidebarToUserOptions: migrated (0.0011s) 

== 20220428094026 CreatePostHotlinkedMedia: migrating =========================
-- execute("CREATE TYPE hotlinked_media_status AS ENUM('downloaded', 'too_large', 'download_failed', 'upload_create_failed')\n")
   -> 0.0004s
-- create_table(:post_hotlinked_media)
   -> 0.0059s
-- execute("CREATE UNIQUE INDEX index_post_hotlinked_media_on_post_id_and_url_md5\nON post_hotlinked_media (post_id, md5(url));\n")
   -> 0.0025s
-- execute("INSERT INTO post_hotlinked_media (post_id, url, status, upload_id, created_at, updated_at)\nSELECT\n  post_id,\n  obj.key AS url,\n  'downloaded',\n  obj.value::bigint AS upload_id,\n  pcf.created_at,\n  pcf.updated_at\nFROM post_custom_fields pcf\nJOIN json_each_text(pcf.value::json) obj ON true\nJOIN uploads ON obj.value::bigint = uploads.id\nWHERE name='downloaded_images'\nAND pcf.value LIKE '{%' -- JSON Object\nON CONFLICT (post_id, md5(url::text)) DO NOTHING\n")
   -> 0.0020s
-- execute("INSERT INTO post_hotlinked_media (post_id, url, status, upload_id, created_at, updated_at)\nSELECT\n  post_id,\n  url.value,\n  'download_failed',\n  NULL,\n  pcf.created_at,\n  pcf.updated_at\nFROM post_custom_fields pcf\nJOIN json_array_elements_text(pcf.value::json) url ON true\nWHERE name='broken_images'\nAND pcf.value LIKE '[%' -- JSON Array\nON CONFLICT (post_id, md5(url::text)) DO NOTHING\n")
   -> 0.0004s
-- execute("INSERT INTO post_hotlinked_media (post_id, url, status, upload_id, created_at, updated_at)\nSELECT\n  post_id,\n  url.value,\n  'too_large',\n  NULL,\n  pcf.created_at,\n  pcf.updated_at\nFROM post_custom_fields pcf\nJOIN json_array_elements_text(pcf.value::json) url ON true\nWHERE name='large_images'\nAND pcf.value LIKE '[%' -- JSON Array\nON CONFLICT (post_id, md5(url::text)) DO NOTHING\n")
   -> 0.0003s
== 20220428094026 CreatePostHotlinkedMedia: migrated (0.0122s) ================

== 20220428094027 FixPostHotlinkedMediaIndex: migrating =======================
-- execute("CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS index_post_hotlinked_media_on_post_id_and_url_md5\nON post_hotlinked_media (post_id, md5(url));\n")
   -> 0.0003s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_post_hotlinked_media_on_post_id_and_url;\n")
   -> 0.0002s
== 20220428094027 FixPostHotlinkedMediaIndex: migrated (0.0015s) ==============

== 20220429164301 DeleteHotlinkedImageCustomFields: migrating =================
-- execute("DELETE FROM post_custom_fields\nWHERE name IN (\n  'downloaded_images',\n  'broken_images',\n  'large_images'\n)\n")
   -> 0.0004s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS post_custom_field_broken_images_idx\n")
   -> 0.0048s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS post_custom_field_downloaded_images_idx\n")
   -> 0.0046s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS post_custom_field_large_images_idx\n")
   -> 0.0042s
== 20220429164301 DeleteHotlinkedImageCustomFields: migrated (0.0146s) ========

== 20220504080457 DropOldChatMessagePostIdActionCodeColumns: migrating ========
== 20220504080457 DropOldChatMessagePostIdActionCodeColumns: migrated (0.0022s) 

== 20220505133851 MigrateCustomGroupDeletionLogs: migrating ===================
== 20220505133851 MigrateCustomGroupDeletionLogs: migrated (0.0008s) ==========

== 20220505191131 AddLastSeenReviewableIdToUser: migrating ====================
-- add_column(:users, :last_seen_reviewable_id, :integer)
   -> 0.0004s
== 20220505191131 AddLastSeenReviewableIdToUser: migrated (0.0007s) ===========

== 20220506221447 SetPmTagsAllowedForGroupsDefault: migrating =================
== 20220506221447 SetPmTagsAllowedForGroupsDefault: migrated (0.0004s) ========

== 20220510131525 RemoveAllowStaffToTagPmsSiteSetting: migrating ==============
-- execute("DELETE FROM site_settings WHERE name = 'allow_staff_to_tag_pms'")
   -> 0.0002s
== 20220510131525 RemoveAllowStaffToTagPmsSiteSetting: migrated (0.0005s) =====

== 20220512011522 BackfillPolymorphicBookmarksAndMakeDefault: migrating =======
== 20220512011522 BackfillPolymorphicBookmarksAndMakeDefault: migrated (0.0016s) 

== 20220512011531 BackfillPolymorphicBookmarks: migrating =====================
== 20220512011531 BackfillPolymorphicBookmarks: migrated (0.0007s) ============

== 20220516142658 RemoveEmailStatusesTable: migrating =========================
-- remove_index(:chat_message_email_statuses, :status)
   -> 0.0020s
-- remove_index(:chat_message_email_statuses, [:user_id, :chat_message_id])
   -> 0.0014s
== 20220516142658 RemoveEmailStatusesTable: migrated (0.0047s) ================

== 20220518140004 TrackLastUnreadMentionWhenEmailed: migrating ================
-- add_column(:user_chat_channel_memberships, :last_unread_mention_when_emailed_id, :integer)
   -> 0.0005s
== 20220518140004 TrackLastUnreadMentionWhenEmailed: migrated (0.0009s) =======

== 20220518180642 RemoveUserOptionLastEmailedAt: migrating ====================
-- remove_column(:user_options, :last_emailed_for_chat, :datetime)
   -> 0.0004s
== 20220518180642 RemoveUserOptionLastEmailedAt: migrated (0.0008s) ===========

== 20220519190829 CreateUserStatuses: migrating ===============================
-- create_table(:user_statuses, {:id=>false})
   -> 0.0078s
== 20220519190829 CreateUserStatuses: migrated (0.0085s) ======================

== 20220526135414 RemoveCorruptedLastReadMessageId: migrating =================
-- execute("DELETE FROM user_chat_channel_memberships uccm\nWHERE NOT EXISTS (\n  SELECT FROM chat_channels cc\n  WHERE cc.id = uccm.chat_channel_id\n);\n")
   -> 0.0008s
-- execute("DELETE FROM chat_messages cm\nWHERE NOT EXISTS (\n  SELECT FROM chat_channels cc\n  WHERE cc.id = cm.chat_channel_id\n);\n")
   -> 0.0004s
-- execute("WITH highest_channel_message_id AS (\n  SELECT chat_channel_id, max(chat_messages.id) as highest_id\n  FROM chat_messages\n  GROUP BY chat_channel_id\n)\nUPDATE user_chat_channel_memberships uccm\nSET last_read_message_id = highest_channel_message_id.highest_id\nFROM highest_channel_message_id\nWHERE highest_channel_message_id.chat_channel_id = uccm.chat_channel_id\nAND uccm.last_read_message_id IS NOT NULL\nAND uccm.last_read_message_id NOT IN (\n  SELECT id FROM chat_messages WHERE chat_messages.chat_channel_id = uccm.chat_channel_id\n)\n")
   -> 0.0005s
-- execute("UPDATE chat_messages cm\nSET in_reply_to_id = NULL\nWHERE NOT EXISTS (\n  SELECT FROM chat_messages cm2\n  WHERE cm.in_reply_to_id = cm2.id\n);\n")
   -> 0.0002s
-- execute("DELETE FROM chat_message_revisions cmr\nWHERE NOT EXISTS (\n  SELECT FROM chat_messages cm\n  WHERE cm.id = cmr.chat_message_id\n);\n")
   -> 0.0004s
-- execute("DELETE FROM chat_message_reactions cmr\nWHERE NOT EXISTS (\n  SELECT FROM chat_messages cm\n  WHERE cm.id = cmr.chat_message_id\n);\n")
   -> 0.0004s
-- execute("DELETE FROM bookmarks b\nWHERE b.bookmarkable_type = 'ChatMessage'\nAND NOT EXISTS (\n  SELECT FROM chat_messages cm\n  WHERE cm.id = b.bookmarkable_id\n);\n")
   -> 0.0003s
-- execute("DELETE FROM chat_mentions\nWHERE NOT EXISTS (\n  SELECT FROM chat_messages cm\n  WHERE cm.id = chat_mentions.chat_message_id\n);\n")
   -> 0.0004s
-- execute("DELETE FROM chat_webhook_events cwe\nWHERE NOT EXISTS (\n  SELECT FROM chat_messages cm\n  WHERE cm.id = cwe.chat_message_id\n);\n")
   -> 0.0003s
-- execute("DELETE FROM chat_uploads\nWHERE NOT EXISTS (\n  SELECT FROM chat_messages cm\n  WHERE cm.id = chat_uploads.chat_message_id\n);\n")
   -> 0.0004s
== 20220526135414 RemoveCorruptedLastReadMessageId: migrated (0.0048s) ========

== 20220526203356 CopyUserUploadsToUploadReferences: migrating ================
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT users.uploaded_avatar_id, 'User', users.id, uploads.created_at, uploads.updated_at\nFROM users\nJOIN uploads ON uploads.id = users.uploaded_avatar_id\nWHERE users.uploaded_avatar_id IS NOT NULL\nON CONFLICT DO NOTHING\n")
   -> 0.0008s
== 20220526203356 CopyUserUploadsToUploadReferences: migrated (0.0012s) =======

== 20220531105951 DropUserChatChannelLastReads: migrating =====================
== 20220531105951 DropUserChatChannelLastReads: migrated (0.0016s) ============

== 20220606061813 AddSmtpTransactionResponseToEmailLogs: migrating ============
-- add_column(:email_logs, :smtp_transaction_response, :string, {:null=>true, :limit=>500})
   -> 0.0005s
== 20220606061813 AddSmtpTransactionResponseToEmailLogs: migrated (0.0010s) ===

== 20220607150432 DisallowNullEmojiOnUserStatus: migrating ====================
-- execute("UPDATE user_statuses SET emoji = 'speech_balloon'")
   -> 0.0004s
-- change_column(:user_statuses, :emoji, :string, {:null=>false})
   -> 0.0003s
== 20220607150432 DisallowNullEmojiOnUserStatus: migrated (0.0011s) ===========
== 20220617151846 RenameDefaultCategoriesRegularSetting: migrating ============
-- execute("UPDATE site_settings\nSET name = 'default_categories_normal'\nWHERE name = 'default_categories_regular'\n")
   -> 0.0002s
== 20220617151846 RenameDefaultCategoriesRegularSetting: migrated (0.0005s) ===

== 20220621164914 DropFlairUrlFromGroups: migrating ===========================
== 20220621164914 DropFlairUrlFromGroups: migrated (0.0014s) ==================

== 20220628031850 CreateSidebarSectionLinks: migrating ========================
-- create_table(:sidebar_section_links)
   -> 0.0161s
-- add_index(:sidebar_section_links, [:user_id, :linkable_type, :linkable_id], {:unique=>true, :name=>"idx_unique_sidebar_section_links"})
   -> 0.0026s
== 20220628031850 CreateSidebarSectionLinks: migrated (0.0193s) ===============

== 20220629190633 AutoJoinUsersToChannels: migrating ==========================
-- add_column(:chat_channels, :auto_join_users, :boolean, {:null=>false, :default=>false})
   -> 0.0007s
== 20220629190633 AutoJoinUsersToChannels: migrated (0.0011s) =================

== 20220630074200 DropChatIsolatedFromUserOptions: migrating ==================
== 20220630074200 DropChatIsolatedFromUserOptions: migrated (0.0015s) =========

== 20220701195731 ConvertChatableTopicsToCategories: migrating ================
== 20220701195731 ConvertChatableTopicsToCategories: migrated (0.0019s) =======

== 20220706114835 AddJoinModeToChannelMemberships: migrating ==================
-- add_column(:user_chat_channel_memberships, :join_mode, :integer, {:null=>false, :default=>0})
   -> 0.0006s
== 20220706114835 AddJoinModeToChannelMemberships: migrated (0.0010s) =========

== 20220712040959 AddCaseSensitiveToWatchedWords: migrating ===================
-- add_column(:watched_words, :case_sensitive, :boolean, {:default=>false, :null=>false})
   -> 0.0005s
== 20220712040959 AddCaseSensitiveToWatchedWords: migrated (0.0008s) ==========

== 20220726164831 FixDeleteRejectedEmailAfterDaysSiteSetting: migrating =======
== 20220726164831 FixDeleteRejectedEmailAfterDaysSiteSetting: migrated (0.0005s) 

== 20220727040437 AddTopicTimersIndex: migrating ==============================
-- add_index(:topic_timers, [:topic_id], {:where=>"deleted_at IS NULL", :name=>"index_topic_timers_on_topic_id"})
   -> 0.0044s
== 20220727040437 AddTopicTimersIndex: migrated (0.0055s) =====================

== 20220727085001 CreateIndexOnReviewablesScoreDescCreatedAtDesc: migrating ===
-- add_index(:reviewables, [:score, :created_at], {:order=>{:score=>:desc, :created_at=>:desc}, :name=>"idx_reviewables_score_desc_created_at_desc"})
   -> 0.0027s
== 20220727085001 CreateIndexOnReviewablesScoreDescCreatedAtDesc: migrated (0.0032s) 

== 20220729032237 AddIndexToChatMessageCreatedAt: migrating ===================
-- execute("CREATE INDEX CONCURRENTLY IF NOT EXISTS\nidx_chat_messages_by_created_at_not_deleted\nON chat_messages (created_at)\nWHERE deleted_at IS NULL\n")
   -> 0.0027s
== 20220729032237 AddIndexToChatMessageCreatedAt: migrated (0.0032s) ==========

== 20220801044610 AddOutboundMessageIdToPost: migrating =======================
-- add_column(:posts, :outbound_message_id, :string)
   -> 0.0005s
== 20220801044610 AddOutboundMessageIdToPost: migrated (0.0008s) ==============

== 20220802014549 DisableChatUploadsIfSecureMediaEnabled: migrating ===========
== 20220802014549 DisableChatUploadsIfSecureMediaEnabled: migrated (0.0007s) ==

== 20220811170600 ResetFlairGroupIdIfNotGroupMember: migrating ================
-- execute("UPDATE users\nSET flair_group_id = NULL\nWHERE flair_group_id IS NOT NULL AND NOT EXISTS (\n  SELECT 1\n  FROM group_users\n  WHERE group_users.user_id = users.id\n    AND group_users.group_id = users.flair_group_id\n)\n")
   -> 0.0007s
== 20220811170600 ResetFlairGroupIdIfNotGroupMember: migrated (0.0010s) =======

== 20220818171849 MoveTlUserHistoryToPreviousAndNewValue: migrating ===========
-- execute("UPDATE user_histories\nSET previous_value = old_tl,\n    new_value = new_tl,\n    details = NULL\nFROM (\n    SELECT id user_history_id,\n           (REGEXP_MATCHES(details, 'old trust level: (d+)', 'i'))[1] old_tl,\n           (REGEXP_MATCHES(details, 'new trust level: (d+)', 'i'))[1] new_tl\n    FROM user_histories\n    WHERE action = 2\n) trust_levels\nWHERE user_histories.id = trust_levels.user_history_id\n")
   -> 0.0008s
== 20220818171849 MoveTlUserHistoryToPreviousAndNewValue: migrated (0.0012s) ==

== 20220825005115 BackfillOutboundMessageId: migrating ========================
== 20220825005115 BackfillOutboundMessageId: migrated (0.0013s) ===============

== 20220825054405 FillPersonalMessageEnabledGroupsBasedOnDeprecatedSettings: migrating 
== 20220825054405 FillPersonalMessageEnabledGroupsBasedOnDeprecatedSettings: migrated (0.0008s) 

== 20220901034107 AddUserCountStaleToChannel: migrating =======================
-- add_column(:chat_channels, :user_count_stale, :boolean, {:default=>false, :null=>false})
   -> 0.0012s
== 20220901034107 AddUserCountStaleToChannel: migrated (0.0016s) ==============

== 20220915132547 AddDominantColorToUploads: migrating ========================
-- add_column(:uploads, :dominant_color, :text, {:null=>true})
   -> 0.0004s
-- add_index(:uploads, :id, {:where=>"dominant_color IS NULL", :name=>"index_uploads_on_id"})
   -> 0.0051s
== 20220915132547 AddDominantColorToUploads: migrated (0.0060s) ===============

== 20220920044310 EnforceUserProfileMaxLimits: migrating ======================
-- execute("UPDATE user_profiles SET location = LEFT(location, 3000) WHERE location IS NOT NULL AND LENGTH(location) > 3000")
   -> 0.0003s
-- execute("UPDATE user_profiles SET website = LEFT(website, 3000) WHERE website IS NOT NULL AND LENGTH(website) > 3000")
   -> 0.0002s
-- change_column(:user_profiles, :location, :string, {:limit=>3000})
   -> 0.0141s
-- change_column(:user_profiles, :website, :string, {:limit=>3000})
   -> 0.0139s
== 20220920044310 EnforceUserProfileMaxLimits: migrated (0.0293s) =============

== 20220923212549 AddSeenPopupsToUserOptions: migrating =======================
-- add_column(:user_options, :seen_popups, :integer, {:array=>true})
   -> 0.0006s
== 20220923212549 AddSeenPopupsToUserOptions: migrated (0.0012s) ==============

== 20220927065328 SetSecureUploadsSettingsBasedOnSecureMediaEquivalent: migrating 
== 20220927065328 SetSecureUploadsSettingsBasedOnSecureMediaEquivalent: migrated (0.0008s) 

== 20220927171707 DisableAllowUncategorizedNewSites: migrating ================
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('allow_uncategorized_topics', 5, 't', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0002s
== 20220927171707 DisableAllowUncategorizedNewSites: migrated (0.0010s) =======

== 20221004122254 DeleteReviewablesTargettingDeletedChatMessages: migrating ===
== 20221004122254 DeleteReviewablesTargettingDeletedChatMessages: migrated (0.0023s) 

== 20221004122343 AddDarkModeLogoToCategories: migrating ======================
-- add_column(:categories, :uploaded_logo_dark_id, :integer, {:index=>true})
   -> 0.0005s
== 20221004122343 AddDarkModeLogoToCategories: migrated (0.0009s) =============

== 20221005143622 AddTypeToChatChannel: migrating =============================
-- add_column(:chat_channels, :type, :string)
   -> 0.0003s
== 20221005143622 AddTypeToChatChannel: migrated (0.0007s) ====================

== 20221006130454 AddAutoResponderTriggeredIdsIndex: migrating ================
-- add_index(:topic_custom_fields, [:topic_id, :value], {:unique=>true, :where=>"name = 'auto_responder_triggered_ids'", :name=>:idx_topic_custom_fields_auto_responder_triggered_ids_partial})
   -> 0.0056s
== 20221006130454 AddAutoResponderTriggeredIdsIndex: migrated (0.0061s) =======

== 20221013045158 AddSidebarListDestinationToUserOption: migrating ============
-- add_column(:user_options, :sidebar_list_destination, :integer, {:default=>0, :null=>false})
   -> 0.0008s
== 20221013045158 AddSidebarListDestinationToUserOption: migrated (0.0012s) ===

== 20221014005208 AddSlugColumnToChatChannel: migrating =======================
-- add_column(:chat_channels, :slug, :string)
   -> 0.0004s
-- add_index(:chat_channels, :slug, {:name=>"index_chat_channels_on_slug"})
   -> 0.0029s
== 20221014005208 AddSlugColumnToChatChannel: migrated (0.0039s) ==============

== 20221017223309 FixGeneralCategoryId: migrating =============================
== 20221017223309 FixGeneralCategoryId: migrated (0.0006s) ====================

== 20221018091412 MigrateChatChannels: migrating ==============================
== 20221018091412 MigrateChatChannels: migrated (0.0008s) =====================

== 20221018100550 AddSourceMapToJavascriptCache: migrating ====================
-- add_column(:javascript_caches, :source_map, :text)
   -> 0.0008s
== 20221018100550 AddSourceMapToJavascriptCache: migrated (0.0012s) ===========

== 20221026035440 SecurityLogOutInviteRedemptionInvitedUsers: migrating =======
== 20221026035440 SecurityLogOutInviteRedemptionInvitedUsers: migrated (0.0020s) 

== 20221027090832 MigrateDmChannels: migrating ================================
== 20221027090832 MigrateDmChannels: migrated (0.0005s) =======================

== 20221101061319 AddLastEditorIdToChatMessages: migrating ====================
-- add_column(:chat_messages, :last_editor_id, :integer)
   -> 0.0004s
-- add_column(:chat_message_revisions, :user_id, :integer)
   -> 0.0003s
-- add_index(:chat_messages, :last_editor_id, {:name=>"index_chat_messages_on_last_editor_id"})
   -> 0.0028s
-- add_index(:chat_message_revisions, :user_id, {:name=>"index_chat_message_revisions_on_user_id"})
   -> 0.0027s
== 20221101061319 AddLastEditorIdToChatMessages: migrated (0.0068s) ===========

== 20221101140632 RenameOnboardingPopupsSiteSetting: migrating ================
-- execute("UPDATE site_settings SET name = 'enable_user_tips' WHERE name = 'enable_onboarding_popups'")
   -> 0.0002s
== 20221101140632 RenameOnboardingPopupsSiteSetting: migrated (0.0006s) =======

== 20221101181505 HideAllUserTipsForExistentUsers: migrating ==================
-- execute("UPDATE user_options SET seen_popups = '{1, 2}'")
   -> 0.0014s
== 20221101181505 HideAllUserTipsForExistentUsers: migrated (0.0018s) =========

== 20221103051248 RemoveInvalidTopicAllowedUsersFromInvites: migrating ========
== 20221103051248 RemoveInvalidTopicAllowedUsersFromInvites: migrated (0.0023s) 

== 20221104054957 BackfillChannelSlugs: migrating =============================
== 20221104054957 BackfillChannelSlugs: migrated (0.0008s) ====================

== 20221107034541 MakeChatEditorIdsNotNull: migrating =========================
-- change_column_null(:chat_messages, :last_editor_id, false, nil)
   -> 0.0003s
-- change_column_null(:chat_message_revisions, :user_id, false, nil)
   -> 0.0002s
== 20221107034541 MakeChatEditorIdsNotNull: migrated (0.0014s) ================

== 20221108032233 DropOldBookmarkColumnsV2: migrating =========================
== 20221108032233 DropOldBookmarkColumnsV2: migrated (0.0026s) ================

== 20221110175456 PopulateDefaultComposerCategory: migrating ==================
== 20221110175456 PopulateDefaultComposerCategory: migrated (0.0007s) =========

== 20221114215902 HideUserTips3To5ForExistingUsers: migrating =================
-- execute("UPDATE user_options SET seen_popups = seen_popups || '{3, 4, 5}'")
   -> 0.0014s
== 20221114215902 HideUserTips3To5ForExistingUsers: migrated (0.0019s) ========

== 20221117052348 TruncateChatMessagesOverMaxLength: migrating ================
-- table_exists?(:chat_messages)
   -> 0.0004s
-- execute("UPDATE chat_messages\nSET message = LEFT(message, 6000), cooked_version = NULL\nWHERE LENGTH(message) > 6000\n")
   -> 0.0003s
== 20221117052348 TruncateChatMessagesOverMaxLength: migrated (0.0012s) =======

== 20221117142910 DeleteOrphanedChannels: migrating ===========================
== 20221117142910 DeleteOrphanedChannels: migrated (0.0007s) ==================

== 20221118104708 AddAllowChannelWideMentionsToChatChannels: migrating ========
-- add_column(:chat_channels, :allow_channel_wide_mentions, :boolean, {:null=>false, :default=>true})
   -> 0.0009s
== 20221118104708 AddAllowChannelWideMentionsToChatChannels: migrated (0.0013s) 

== 20221122070108 SaveChatAllowedGroupsSiteSetting: migrating =================
== 20221122070108 SaveChatAllowedGroupsSiteSetting: migrated (0.0006s) ========

== 20221125001635 AddBccAddressesToEmailLog: migrating ========================
-- add_column(:email_logs, :bcc_addresses, :text, {:null=>true})
   -> 0.0004s
== 20221125001635 AddBccAddressesToEmailLog: migrated (0.0007s) ===============

== 20221125173217 RemoveEnableWhispersSiteSetting: migrating ==================
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nSELECT 'whispers_allowed_groups', '20', '3', created_at, NOW()\nFROM site_settings\nWHERE name = 'enable_whispers' AND value = 't'\nON CONFLICT DO NOTHING\n")
   -> 0.0003s
-- execute("UPDATE site_settings\nSET value = array_to_string(array_append(string_to_array(value, '|'), '3'), '|')\nWHERE name = 'whispers_allowed_groups' AND\n      EXISTS(SELECT 1 FROM site_settings WHERE name = 'enable_whispers' AND value = 't') AND\n      NOT '3' = ANY(string_to_array(value, '|'))\n")
   -> 0.0003s
-- execute("UPDATE site_settings\nSET value = ''\nWHERE name = 'whispers_allowed_groups' AND\n      NOT EXISTS(SELECT 1 FROM site_settings WHERE name = 'enable_whispers' AND value = 't')\n")
   -> 0.0002s
-- execute("DELETE FROM site_settings WHERE name = 'enable_whispers'\n")
   -> 0.0002s
== 20221125173217 RemoveEnableWhispersSiteSetting: migrated (0.0014s) =========

== 20221201024458 MakeChannelSlugsUniqueWithIndex: migrating ==================
== 20221201024458 MakeChannelSlugsUniqueWithIndex: migrated (0.0021s) =========

== 20221201032830 DropTmpChatSlugTables: migrating ============================
== 20221201032830 DropTmpChatSlugTables: migrated (0.0008s) ===================

== 20221201035918 AddSlugUniqueIndexForChatChannels: migrating ================
-- remove_index(:chat_channels, :slug)
   -> 0.0024s
-- add_index(:chat_channels, :slug, {:unique=>true, :name=>"index_chat_channels_on_slug"})
   -> 0.0036s
== 20221201035918 AddSlugUniqueIndexForChatChannels: migrated (0.0065s) =======

== 20221202032006 AddChatMessageCountToChatChannels: migrating ================
-- add_column(:chat_channels, :messages_count, :integer, {:null=>false, :default=>0})
   -> 0.0008s
-- add_index(:chat_channels, :messages_count, {:name=>"index_chat_channels_on_messages_count"})
   -> 0.0029s
== 20221202032006 AddChatMessageCountToChatChannels: migrated (0.0043s) =======

== 20221202043755 UpdateChatChannelMessageCounts: migrating ===================
== 20221202043755 UpdateChatChannelMessageCounts: migrated (0.0010s) ==========

== 20221205225450 MigrateSidebarSiteSettings: migrating =======================
== 20221205225450 MigrateSidebarSiteSettings: migrated (0.0006s) ==============

== 20221211142629 RemoveUpdatedTranslationOverrides: migrating ================
-- execute("DELETE\nFROM translation_overrides\nWHERE translation_key IN (\n  'js.user.messages.read_more_group_pm_MF',\n  'js.user.messages.read_more_personal_pm_MF',\n  'js.topic.read_more_MF',\n  'js.topic.bumped_at_title_MF',\n  'js.topic.read_more_in_category',\n  'js.topic.read_more'\n)\n")
   -> 0.0002s
== 20221211142629 RemoveUpdatedTranslationOverrides: migrated (0.0005s) =======

== 20221212234948 DropTopicAllowedUsersBackupNov2022: migrating ===============
== 20221212234948 DropTopicAllowedUsersBackupNov2022: migrated (0.0006s) ======

== 20230103004613 MakeExperimentalHashtagFeatureDefaultForNewSites: migrating =
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nVALUES ('enable_experimental_hashtag_autocomplete', 5, 'f', now(), now())\nON CONFLICT DO NOTHING\n")
   -> 0.0003s
== 20230103004613 MakeExperimentalHashtagFeatureDefaultForNewSites: migrated (0.0012s) 

== 20230104054425 RenameRateLimitSearchAnon: migrating ========================
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'rate_limit_search_anon_user_per_minute', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'rate_limit_search_anon_user'\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings (name, data_type, value, created_at, updated_at)\nSELECT 'rate_limit_search_anon_global_per_minute', data_type, value, created_at, updated_at\nFROM site_settings\nWHERE name = 'rate_limit_search_anon_global'\n")
   -> 0.0002s
== 20230104054425 RenameRateLimitSearchAnon: migrated (0.0008s) ===============

== 20230104054426 DeleteOldRateLimitSearchAnon: migrating =====================
-- execute("DELETE FROM site_settings WHERE name in ('rate_limit_search_anon_user', 'rate_limit_search_anon_global')")
   -> 0.0002s
== 20230104054426 DeleteOldRateLimitSearchAnon: migrated (0.0005s) ============

== 20230105153520 TriggerPostRebakeLocalOneboxXss: migrating ==================
== 20230105153520 TriggerPostRebakeLocalOneboxXss: migrated (0.0004s) =========

== 20230111223803 DeleteMisconfiguredEmbeddableHosts: migrating ===============
-- execute("DELETE FROM embeddable_hosts eh1\nWHERE eh1.id IN (\n  SELECT eh2.id FROM embeddable_hosts eh2\n  LEFT JOIN categories ON categories.id = eh2.category_id\n  WHERE eh2.category_id IS NOT NULL\n  AND categories.id IS NULL\n)\n")
   -> 0.0006s
== 20230111223803 DeleteMisconfiguredEmbeddableHosts: migrated (0.0009s) ======

== 20230113002617 ReindexInvalidIndexes: migrating ============================
== 20230113002617 ReindexInvalidIndexes: migrated (0.0011s) ===================

== 20230115233416 CreateSidebarSections: migrating ============================
-- create_table(:sidebar_sections)
   -> 0.0061s
-- add_index(:sidebar_sections, [:user_id, :title], {:unique=>true, :name=>"index_sidebar_sections_on_user_id_and_title"})
   -> 0.0024s
== 20230115233416 CreateSidebarSections: migrated (0.0090s) ===================

== 20230116090324 DropChatDraftsOverMaxLength: migrating ======================
-- table_exists?(:chat_drafts)
   -> 0.0005s
-- execute("DELETE FROM chat_drafts\nWHERE LENGTH(data) > 50000\n")
   -> 0.0003s
== 20230116090324 DropChatDraftsOverMaxLength: migrated (0.0012s) =============

== 20230117002110 CreateSidebarUrl: migrating =================================
-- create_table(:sidebar_urls)
   -> 0.0057s
== 20230117002110 CreateSidebarUrl: migrated (0.0063s) ========================

== 20230117143451 DropInvalidDrafts: migrating ================================
-- execute("DELETE FROM drafts\nWHERE LENGTH(data) > 400000\n")
   -> 0.0003s
== 20230117143451 DropInvalidDrafts: migrated (0.0006s) =======================

== 20230118020114 AddPublicTopicCountToTags: migrating ========================
-- add_column(:tags, :public_topic_count, :integer, {:default=>0, :null=>false})
   -> 0.0007s
-- execute("UPDATE tags t\nSET public_topic_count = x.topic_count\nFROM (\n  SELECT\n    COUNT(topics.id) AS topic_count,\n    tags.id AS tag_id\n  FROM tags\n  INNER JOIN topic_tags ON tags.id = topic_tags.tag_id\n  INNER JOIN topics ON topics.id = topic_tags.topic_id AND topics.deleted_at IS NULL AND topics.archetype != 'private_message'\n  INNER JOIN categories ON categories.id = topics.category_id AND NOT categories.read_restricted\n  GROUP BY tags.id\n) x\nWHERE x.tag_id = t.id\nAND x.topic_count <> t.public_topic_count;\n")
   -> 0.0014s
== 20230118020114 AddPublicTopicCountToTags: migrated (0.0026s) ===============

== 20230118042740 AddSidebarSectionIdToSidebarSectionLinks: migrating =========
-- add_column(:sidebar_section_links, :sidebar_section_id, :integer, {:index=>true})
   -> 0.0004s
== 20230118042740 AddSidebarSectionIdToSidebarSectionLinks: migrated (0.0007s) 

== 20230119000943 AddStaffTopicCountToTags: migrating =========================
-- add_column(:tags, :staff_topic_count, :integer, {:default=>0, :null=>false})
   -> 0.0006s
-- execute("UPDATE tags t\nSET staff_topic_count = x.topic_count\nFROM (\n  SELECT COUNT(topics.id) AS topic_count, tags.id AS tag_id\n  FROM tags\n  LEFT JOIN topic_tags ON tags.id = topic_tags.tag_id\n  LEFT JOIN topics ON topics.id = topic_tags.topic_id\n  AND topics.deleted_at IS NULL\n  AND topics.archetype != 'private_message'\n  GROUP BY tags.id\n) x\nWHERE x.tag_id = t.id\nAND x.topic_count <> t.staff_topic_count\n")
   -> 0.0006s
== 20230119000943 AddStaffTopicCountToTags: migrated (0.0016s) ================

== 20230119024157 RemoveTopicCountFromTags: migrating =========================
== 20230119024157 RemoveTopicCountFromTags: migrated (0.0015s) ================

== 20230119091939 DropOrphanedReviewableFlaggedPosts: migrating ===============
== 20230119091939 DropOrphanedReviewableFlaggedPosts: migrated (0.0006s) ======

== 20230119094939 RemoveWildcardFromEmailDomainSiteSettings: migrating ========
-- execute("UPDATE site_settings\nSET value = regexp_replace(value, '\\*(\\.)?|\\?', '', 'g')\nWHERE name IN (\n  'auto_approve_email_domains',\n  'allowed_email_domains',\n  'blocked_email_domains'\n)\n")
   -> 0.0002s
== 20230119094939 RemoveWildcardFromEmailDomainSiteSettings: migrated (0.0005s) 

== 20230123020036 MoveChatUploadsToUploadReferences: migrating ================
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT chat_uploads.upload_id, 'ChatMessage', chat_uploads.chat_message_id, chat_uploads.created_at, chat_uploads.updated_at\nFROM chat_uploads\nINNER JOIN uploads ON uploads.id = chat_uploads.upload_id\nON CONFLICT DO NOTHING\n")
   -> 0.0005s
== 20230123020036 MoveChatUploadsToUploadReferences: migrated (0.0009s) =======

== 20230123025112 MoveChatUploadsToUploadReferencesPost: migrating ============
-- execute("INSERT INTO upload_references(upload_id, target_type, target_id, created_at, updated_at)\nSELECT chat_uploads.upload_id, 'ChatMessage', chat_uploads.chat_message_id, chat_uploads.created_at, chat_uploads.updated_at\nFROM chat_uploads\nINNER JOIN uploads ON uploads.id = chat_uploads.upload_id\nON CONFLICT DO NOTHING\n")
   -> 0.0003s
== 20230123025112 MoveChatUploadsToUploadReferencesPost: migrated (0.0006s) ===

== 20230127173249 TruncateUserStatusTo100Characters: migrating ================
-- execute("UPDATE user_statuses SET description = left(description, 100)")
   -> 0.0003s
-- execute("UPDATE user_statuses SET emoji = left(emoji, 100)")
   -> 0.0001s
== 20230127173249 TruncateUserStatusTo100Characters: migrated (0.0007s) =======

== 20230130053144 AddThreadingEnabledToChatChannels: migrating ================
-- add_column(:chat_channels, :threading_enabled, :boolean, {:default=>false, :null=>false})
   -> 0.0007s
== 20230130053144 AddThreadingEnabledToChatChannels: migrated (0.0011s) =======

== 20230201012734 CreateChatThreadingModels: migrating ========================
-- create_table(:chat_threads)
   -> 0.0065s
-- add_index(:chat_threads, :channel_id, {:name=>"index_chat_threads_on_channel_id"})
   -> 0.0024s
-- add_index(:chat_threads, :original_message_id, {:name=>"index_chat_threads_on_original_message_id"})
   -> 0.0024s
-- add_index(:chat_threads, :original_message_user_id, {:name=>"index_chat_threads_on_original_message_user_id"})
   -> 0.0023s
-- add_index(:chat_threads, :status, {:name=>"index_chat_threads_on_status"})
   -> 0.0023s
-- add_index(:chat_threads, [:channel_id, :status], {:name=>"index_chat_threads_on_channel_id_and_status"})
   -> 0.0025s
-- add_column(:chat_messages, :thread_id, :bigint, {:null=>true})
   -> 0.0004s
-- add_index(:chat_messages, :thread_id, {:name=>"index_chat_messages_on_thread_id"})
   -> 0.0024s
== 20230201012734 CreateChatThreadingModels: migrated (0.0220s) ===============

== 20230201192925 AddTrigramIndexesToUsers: migrating =========================
-- add_index(:users, :username_lower, {:using=>"gist", :opclass=>:gist_trgm_ops, :algorithm=>:concurrently, :name=>"index_users_on_username_lower_trgm"})
   -> 0.0019s
-- add_index(:users, :name, {:using=>"gist", :opclass=>:gist_trgm_ops, :algorithm=>:concurrently, :name=>"index_users_on_name_trgm"})
   -> 0.0009s
== 20230201192925 AddTrigramIndexesToUsers: migrated (0.0034s) ================

== 20230202021414 RemoveEnableNewUserProfileNavGroupsSiteSettings: migrating ==
-- execute("DELETE FROM site_settings WHERE name = 'enable_new_user_profile_nav_groups'")
   -> 0.0002s
== 20230202021414 RemoveEnableNewUserProfileNavGroupsSiteSettings: migrated (0.0006s) 

== 20230202173641 CreateFormTemplates: migrating ==============================
-- create_table(:form_templates)
   -> 0.0058s
-- add_index(:form_templates, :name, {:unique=>true, :name=>"index_form_templates_on_name"})
   -> 0.0023s
== 20230202173641 CreateFormTemplates: migrated (0.0086s) =====================

== 20230202204937 AddIndexToPostsWhereNotDeletedOrEmpty: migrating ============
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_posts_on_id_topic_id_where_not_deleted_or_empty\n")
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY index_posts_on_id_topic_id_where_not_deleted_or_empty ON posts (id, topic_id) where deleted_at IS NULL AND raw <> ''\n")
   -> 0.0034s
== 20230202204937 AddIndexToPostsWhereNotDeletedOrEmpty: migrated (0.0041s) ===

== 20230206033907 AddIconToSidebarUrls: migrating =============================
-- add_column(:sidebar_urls, :icon, :string)
   -> 0.0004s
== 20230206033907 AddIconToSidebarUrls: migrated (0.0008s) ====================

== 20230207042719 AddLimitsToSidebarSectionsAndSidebarUrls: migrating =========
-- execute("UPDATE sidebar_urls SET icon = 'link' WHERE icon IS NULL")
   -> 0.0004s
-- change_column(:sidebar_sections, :title, :string, {:limit=>30, :null=>false})
   -> 0.0054s
-- change_column(:sidebar_urls, :icon, :string, {:limit=>40, :null=>false})
   -> 0.0051s
-- change_column(:sidebar_urls, :name, :string, {:limit=>80, :null=>false})
   -> 0.0049s
-- change_column(:sidebar_urls, :value, :string, {:limit=>200, :null=>false})
   -> 0.0030s
== 20230207042719 AddLimitsToSidebarSectionsAndSidebarUrls: migrated (0.0195s) 

== 20230207093514 CreateCategorySettings: migrating ===========================
-- create_table(:category_settings)
   -> 0.0066s
== 20230207093514 CreateCategorySettings: migrated (0.0072s) ==================

== 20230208020404 PopulateCategorySettings: migrating =========================
-- execute("INSERT INTO\n  category_settings(\n    category_id,\n    require_topic_approval,\n    require_reply_approval,\n    num_auto_bump_daily,\n    created_at,\n    updated_at\n  )\nSELECT\n  category_id,\n  MAX(\n    CASE WHEN (name = 'require_topic_approval')\n    THEN NULLIF(value, '') ELSE NULL END\n  )::boolean AS require_topic_approval,\n  MAX(\n    CASE WHEN (name = 'require_reply_approval')\n    THEN NULLIF(value, '') ELSE NULL END\n  )::boolean AS require_reply_approval,\n  MAX(\n    CASE WHEN (name = 'num_auto_bump_daily')\n    THEN NULLIF(value, '') ELSE NULL END\n  )::integer AS num_auto_bump_daily,\n  NOW() AS created_at,\n  NOW() AS updated_at\nFROM category_custom_fields\nWHERE name IN (\n  'require_topic_approval',\n  'require_reply_approval',\n  'num_auto_bump_daily'\n)\nGROUP BY category_id;\n")
   -> 0.0008s
== 20230208020404 PopulateCategorySettings: migrated (0.0013s) ================

== 20230209222225 AddLinkableIndexToSidebarSectionLinks: migrating ============
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_sidebar_section_links_on_linkable_type_and_linkable_id\n")
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY index_sidebar_section_links_on_linkable_type_and_linkable_id\nON sidebar_section_links (linkable_type,linkable_id)\n")
   -> 0.0031s
== 20230209222225 AddLinkableIndexToSidebarSectionLinks: migrated (0.0039s) ===

== 20230213234415 CreateCategoryFormTemplates: migrating ======================
-- create_table(:category_form_templates)
   -> 0.0088s
== 20230213234415 CreateCategoryFormTemplates: migrated (0.0094s) =============

== 20230214044350 AddPublicToSidebarSections: migrating =======================
-- add_column(:sidebar_sections, :public, :boolean, {:null=>false, :default=>false})
   -> 0.0008s
== 20230214044350 AddPublicToSidebarSections: migrated (0.0012s) ==============

== 20230224193734 CreateThemeSvgSprite: migrating =============================
-- create_table(:theme_svg_sprites)
   -> 0.0063s
-- add_index(:theme_svg_sprites, :theme_id, {:unique=>true, :name=>"index_theme_svg_sprites_on_theme_id"})
   -> 0.0026s
== 20230224193734 CreateThemeSvgSprite: migrated (0.0096s) ====================

== 20230224225129 BackfillSvgSprites: migrating ===============================
== 20230224225129 BackfillSvgSprites: migrated (0.0160s) ======================

== 20230227050146 UpdateNarrativeBadgeIcons: migrating ========================
-- execute("UPDATE badges\nSET icon = 'stamp'\nWHERE\n  name IN ('Certified', 'Licensed')\n  AND icon = 'fa-certificate'\n")
   -> 0.0005s
== 20230227050146 UpdateNarrativeBadgeIcons: migrated (0.0025s) ===============

== 20230227050147 UpdateBadgeIcons: migrating =================================
-- execute("UPDATE badges SET icon = 'book-reader' WHERE id IN (17) AND icon = 'fa-certificate'")
   -> 0.0005s
-- execute("UPDATE badges SET icon = 'file-alt' WHERE id IN (16) AND icon = 'fa-certificate'")
   -> 0.0002s
-- execute("UPDATE badges SET icon = 'link' WHERE id IN (14,28,29,30) AND icon = 'fa-certificate'")
   -> 0.0002s
-- execute("UPDATE badges SET icon = 'quote-right' WHERE id IN (15) AND icon = 'fa-certificate'")
   -> 0.0002s
-- execute("UPDATE badges SET icon = 'heart' WHERE id IN (11,5) AND icon = 'fa-certificate'")
   -> 0.0002s
-- execute("UPDATE badges SET icon = 'flag' WHERE id IN (13) AND icon = 'fa-certificate'")
   -> 0.0001s
-- execute("UPDATE badges SET icon = 'share-alt' WHERE id IN (12,21,22,23) AND icon = 'fa-certificate'")
   -> 0.0002s
-- execute("UPDATE badges SET icon = 'user-edit' WHERE id IN (9) AND icon = 'fa-certificate'")
   -> 0.0001s
-- execute("UPDATE badges SET icon = 'pen' WHERE id IN (10) AND icon = 'fa-certificate'")
   -> 0.0001s
-- execute("UPDATE badges SET icon = 'far-edit' WHERE id IN (48) AND icon = 'fa-certificate'")
   -> 0.0001s
-- execute("UPDATE badges SET icon = 'reply' WHERE id IN (6,7,8) AND icon = 'fa-certificate'")
   -> 0.0003s
-- execute("UPDATE badges SET icon = 'file-signature' WHERE id IN (18,19,20) AND icon = 'fa-certificate'")
   -> 0.0002s
-- execute("UPDATE badges SET icon = 'at' WHERE id IN (40) AND icon = 'fa-certificate'")
   -> 0.0002s
-- execute("UPDATE badges SET icon = 'smile' WHERE id IN (41) AND icon = 'fa-certificate'")
   -> 0.0001s
-- execute("UPDATE badges SET icon = 'cube' WHERE id IN (42) AND icon = 'fa-certificate'")
   -> 0.0002s
-- execute("UPDATE badges SET icon = 'envelope' WHERE id IN (43) AND icon = 'fa-certificate'")
   -> 0.0001s
-- execute("UPDATE badges SET icon = 'medal' WHERE id IN (44) AND icon = 'fa-certificate'")
   -> 0.0001s
-- execute("UPDATE badges SET icon = 'birthday-cake' WHERE id IN (24) AND icon = 'far-clock'")
   -> 0.0002s
== 20230227050147 UpdateBadgeIcons: migrated (0.0073s) ========================

== 20230227172543 MakeChatMentionNotificationIdNullable: migrating ============
-- change_column_null(:chat_mentions, :notification_id, true, nil)
   -> 0.0003s
== 20230227172543 MakeChatMentionNotificationIdNullable: migrated (0.0008s) ===

== 20230228062442 AddChatHeaderIndicatorPreference: migrating =================
-- add_column(:user_options, :chat_header_indicator_preference, :integer, {:default=>0, :null=>false})
   -> 0.0008s
== 20230228062442 AddChatHeaderIndicatorPreference: migrated (0.0012s) ========

== 20230228105851 DropBadgeGrantedTitleColumn: migrating ======================
== 20230228105851 DropBadgeGrantedTitleColumn: migrated (0.0017s) =============

== 20230301071240 AddAutoBumpCooldownDaysToCategorySettings: migrating ========
-- add_column(:category_settings, :auto_bump_cooldown_days, :integer, {:default=>1})
   -> 0.0006s
== 20230301071240 AddAutoBumpCooldownDaysToCategorySettings: migrated (0.0011s) 

== 20230303015952 AddExternalToSidebarUrls: migrating =========================
-- add_column(:sidebar_urls, :external, :boolean, {:default=>false, :null=>false})
   -> 0.0007s
== 20230303015952 AddExternalToSidebarUrls: migrated (0.0011s) ================

== 20230307051200 AddPositionToSidebarSectionLinks: جارٍ الهجرة =================
-- add_column(:sidebar_section_links, :position, :integer, {:default=>0, :null=>false})
   -> 0.0006 ثانية
-- execute("UPDATE sidebar_section_links SET position = id")
   -> 0.0004 ثانية
-- add_index(:sidebar_section_links, [:user_id, :sidebar_section_id, :position], {:unique=>true, :name=>"links_user_id_section_id_position"})
   -> 0.0033 ثانية
== 20230307051200 AddPositionToSidebarSectionLinks: اكتملت الهجرة (0.0049 ثانية) ========

== 20230308042434 BackfillAutoBumpCooldownDaysCategorySetting: جارٍ الهجرة ======
-- execute("INSERT INTO\n  category_settings(\n    category_id,\n    auto_bump_cooldown_days,\n    created_at,\n    updated_at\n  )\nSELECT\n  id,\n  1,\n  NOW(),\n  NOW()\nFROM categories\nON CONFLICT (category_id)\nDO\n  UPDATE SET\n    auto_bump_cooldown_days = 1,\n    updated_at = NOW();\n")
   -> 0.0008 ثانية
== 20230308042434 BackfillAutoBumpCooldownDaysCategorySetting: اكتملت الهجرة (0.0013 ثانية) 

== 20230317194217 RebakeLazyYtPosts: جارٍ الهجرة ================================
-- execute("UPDATE posts SET baked_version = 0\nWHERE cooked LIKE '%lazyYT-container%'\n")
   -> 0.0019 ثانية
== 20230317194217 RebakeLazyYtPosts: اكتملت الهجرة (0.0024 ثانية) =======================

== 20230328034956 AddSidebarSectionIdIndexToSidebarSectionLink: جارٍ الهجرة =====
-- execute("DROP INDEX CONCURRENTLY IF EXISTS idx_sidebar_section_links_on_sidebar_section_id\n")
   -> 0.0002 ثانية
-- execute("CREATE UNIQUE INDEX CONCURRENTLY idx_sidebar_section_links_on_sidebar_section_id\nON sidebar_section_links (sidebar_section_id, user_id, position)\n")
   -> 0.0030 ثانية
-- execute("DROP INDEX CONCURRENTLY IF EXISTS links_user_id_section_id_position\n")
   -> 0.0042 ثانية
== 20230328034956 AddSidebarSectionIdIndexToSidebarSectionLink: اكتملت الهجرة (0.0081 ثانية) 

== 20230403012844 DropChatUploads: جارٍ الهجرة ==================================
== 20230403012844 DropChatUploads: اكتملت الهجرة (0.0016 ثانية) =========================

== 20230403063113 DropIdxPostCustomFieldsAkismet: جارٍ الهجرة ===================
-- execute("DROP INDEX IF EXISTS idx_post_custom_fields_akismet")
   -> 0.0004 ثانية
== 20230403063113 DropIdxPostCustomFieldsAkismet: اكتملت الهجرة (0.0009 ثانية) ==========

== 20230403094936 ChangeGoogleAnalyticsDefault: جارٍ الهجرة =====================
== 20230403094936 ChangeGoogleAnalyticsDefault: اكتملت الهجرة (0.0013 ثانية) ============

== 20230404064728 SystemUserForPublicSections: جارٍ الهجرة ======================
-- execute("      UPDATE sidebar_sections\n      SET user_id = -1\n      WHERE public IS TRUE\n")
   -> 0.0004 ثانية
-- execute("      UPDATE sidebar_section_links\n      SET user_id = -1\n      FROM sidebar_sections\n      WHERE sidebar_sections.public IS TRUE\n        AND sidebar_section_links.sidebar_section_id = sidebar_sections.id\n")
   -> 0.0004 ثانية
== 20230404064728 SystemUserForPublicSections: اكتملت الهجرة (0.0012 ثانية) =============

== 20230405121453 AddPasswordAlgorithmToUsers: جارٍ الهجرة ======================
-- column_exists?(:users, :password_algorithm)
   -> 0.0023 ثانية
-- add_column(:users, :password_algorithm, :string, {:limit=>64})
   -> 0.0005 ثانية
-- execute("UPDATE users SET password_algorithm = '$pbkdf2-sha256$i=64000,l=32$'\nWHERE id IN (\n  SELECT id FROM users\n  WHERE users.password_hash IS NOT NULL\n  AND users.password_algorithm IS NULL\n  LIMIT 5000\n)\n")
   -> 0.0038 ثانية
== 20230405121453 AddPasswordAlgorithmToUsers: اكتملت الهجرة (0.0072 ثانية) =============

== 20230405121454 UpdatePasswordAlgorithmPostDeploy: جارٍ الهجرة ================
-- execute("UPDATE users SET password_algorithm = '$pbkdf2-sha256$i=64000,l=32$'\nWHERE users.password_algorithm IS NULL\nAND users.password_hash IS NOT NULL\n")
   -> 0.0003 ثانية
== 20230405121454 UpdatePasswordAlgorithmPostDeploy: اكتملت الهجرة (0.0007 ثانية) =======

== 20230411012630 AddThreadNotDeletedIndexChatMessages: جارٍ الهجرة =============
-- execute("DROP INDEX IF EXISTS idx_chat_messages_by_thread_id_not_deleted\n")
   -> 0.0002 ثانية
-- execute("CREATE INDEX CONCURRENTLY IF NOT EXISTS\nidx_chat_messages_by_thread_id_not_deleted\nON chat_messages (thread_id)\nWHERE deleted_at IS NULL\n")
   -> 0.0031 ثانية
== 20230411012630 AddThreadNotDeletedIndexChatMessages: اكتملت الهجرة (0.0037 ثانية) ====

== 20230411023246 AddChatMessageRepliesCountToChatThreads: جارٍ الهجرة ==========
-- add_column(:chat_threads, :replies_count, :integer, {:null=>false, :default=>0})
   -> 0.0006 ثانية
-- add_index(:chat_threads, :replies_count, {:name=>"index_chat_threads_on_replies_count"})
   -> 0.0026 ثانية
== 20230411023246 AddChatMessageRepliesCountToChatThreads: اكتملت الهجرة (0.0037 ثانية) =

== 20230411023340 UpdateThreadReplyCounts: جارٍ الهجرة ==========================
== 20230411023340 UpdateThreadReplyCounts: اكتملت الهجرة (0.0013 ثانية) =================

== 20230411031428 AddSegmentToSidebarUrls: جارٍ الهجرة ==========================
-- add_column(:sidebar_urls, :segment, :integer, {:default=>0, :null=>false})
   -> 0.0006 ثانية
== 20230411031428 AddSegmentToSidebarUrls: اكتملت الهجرة (0.0010 ثانية) =================

== 20230411031520 AddSectionTypeToSidebarSections: جارٍ الهجرة ==================
-- add_column(:sidebar_sections, :section_type, :integer)
   -> 0.0003 ثانية
-- add_index(:sidebar_sections, :section_type, {:unique=>true, :name=>"index_sidebar_sections_on_section_type"})
   -> 0.0026 ثانية
== 20230411031520 AddSectionTypeToSidebarSections: اكتملت الهجرة (0.0034 ثانية) =========

== 20230411032053 InsertCommunityToSidebarSections: جارٍ الهجرة =================
== 20230411032053 InsertCommunityToSidebarSections: اكتملت الهجرة (0.0021 ثانية) ========

== 20230412120414 AddPrefersEncryptFieldToPendingPms: جارٍ الهجرة ===============
-- add_column(:discourse_automation_pending_pms, :prefers_encrypt, :boolean, {:default=>false})
   -> 0.0005 ثانية
-- execute("UPDATE discourse_automation_pending_pms\nSET prefers_encrypt = false\n")
   -> 0.0003 ثانية
-- change_column_null(:discourse_automation_pending_pms, :prefers_encrypt, false, nil)
   -> 0.0002 ثانية
== 20230412120414 AddPrefersEncryptFieldToPendingPms: اكتملت الهجرة (0.0013 ثانية) ======

== 20230413121500 AddDiscourseConnectAllowedRedirectDomainsToSiteSettings: جارٍ الهجرة 
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nSELECT 'discourse_connect_allowed_redirect_domains', 8, '*', created_at, NOW()\nFROM site_settings\nWHERE name = 'discourse_connect_allows_all_return_paths' AND value = 't'\n")
   -> 0.0002 ثانية
-- execute("DELETE FROM site_settings\nWHERE name = 'discourse_connect_allows_all_return_paths'\n")
   -> 0.0001 ثانية
== 20230413121500 AddDiscourseConnectAllowedRedirectDomainsToSiteSettings: اكتملت الهجرة (0.0007 ثانية) 

== 20230419001801 RemoveEnableCustomSidebarSectionsSetting: جارٍ الهجرة =========
-- execute("DELETE FROM site_settings WHERE name = 'enable_custom_sidebar_sections'")
   -> 0.0002 ثانية
== 20230419001801 RemoveEnableCustomSidebarSectionsSetting: اكتملت الهجرة (0.0005 ثانية) 

== 20230501022508 RenameNotifyAboutFlagsAfterSiteSetting: جارٍ الهجرة ===========
-- execute("UPDATE site_settings SET name = 'notify_about_reviewable_item_after' WHERE name = 'notify_about_flags_after'")
   -> 0.0002 ثانية
== 20230501022508 RenameNotifyAboutFlagsAfterSiteSetting: اكتملت الهجرة (0.0005 ثانية) ==

== 20230505113906 HideUserTipsForExistingUsers: جارٍ الهجرة =====================
-- execute("UPDATE user_options SET seen_popups = '{1, 2, 3, 4, 5}'")
   -> 0.0014 ثانية
== 20230505113906 HideUserTipsForExistingUsers: اكتملت الهجرة (0.0017 ثانية) ============

== 20230509214723 SeparateTrustedUsersCanEditOthersSiteSetting: جارٍ الهجرة =====
-- select_value("SELECT 1 FROM site_settings WHERE name = 'trusted_users_can_edit_others' AND value = 'f'")
   -> 0.0003 ثانية
== 20230509214723 SeparateTrustedUsersCanEditOthersSiteSetting: اكتملت الهجرة (0.0006 ثانية) 

== 20230510142249 AddUserChatThreadMemberships: جارٍ الهجرة =====================
-- create_table(:user_chat_thread_memberships)
   -> 0.0042 ثانية
-- add_index(:user_chat_thread_memberships, [:user_id, :thread_id], {:unique=>true, :name=>"user_chat_thread_unique_memberships"})
   -> 0.0024 ثانية
== 20230510142249 AddUserChatThreadMemberships: اكتملت الهجرة (0.0071 ثانية) ============

== 20230515103515 CreateWatchedWordGroups: جارٍ الهجرة ==========================
-- create_table(:watched_word_groups)
   -> 0.0035 ثانية
== 20230515103515 CreateWatchedWordGroups: اكتملت الهجرة (0.0040 ثانية) =================

== 20230515131111 AddWatchedWordGroupIdToWatchedWords: جارٍ الهجرة ==============
-- add_column(:watched_words, :watched_word_group_id, :bigint)
   -> 0.0004 ثانية
-- add_index(:watched_words, :watched_word_group_id, {:name=>"index_watched_words_on_watched_word_group_id"})
   -> 0.0024 ثانية
== 20230515131111 AddWatchedWordGroupIdToWatchedWords: اكتملت الهجرة (0.0033 ثانية) =====

== 20230523073109 DeleteOldPersonalMessageSettings: جارٍ الهجرة =================
-- execute("DELETE FROM site_settings WHERE name = 'enable_personal_messages'\n")
   -> 0.0002 ثانية
-- execute("DELETE FROM site_settings WHERE name = 'min_trust_to_send_messages'\n")
   -> 0.0001 ثانية
== 20230523073109 DeleteOldPersonalMessageSettings: اكتملت الهجرة (0.0007 ثانية) ========

== 20230528134326 EnableExperimentalHashtagAutocompleteTrueForAllSites: جارٍ الهجرة 
== 20230528134326 EnableExperimentalHashtagAutocompleteTrueForAllSites: اكتملت الهجرة (0.0004 ثانية) 

== 20230602034711 RenameEverythingToTopicsLink: جارٍ الهجرة =====================
== 20230602034711 RenameEverythingToTopicsLink: اكتملت الهجرة (0.0010 ثانية) ============

== 20230607091233 BackfillThreadMemberships: جارٍ الهجرة ========================
-- execute("INSERT INTO user_chat_thread_memberships(\n  user_id,\n  thread_id,\n  notification_level,\n  last_read_message_id,\n  created_at,\n  updated_at\n)\nSELECT\n  thread_participant_stats.user_id,\n  thread_participant_stats.thread_id,\n  2,\n  (\n    SELECT id FROM chat_messages\n    WHERE thread_id = thread_participant_stats.thread_id\n    AND deleted_at IS NULL\n    ORDER BY created_at DESC, id DESC\n    LIMIT 1\n  ),\n  NOW(),\n  NOW()\nFROM (\n  SELECT chat_messages.thread_id, chat_messages.user_id\n  FROM chat_messages\n  INNER JOIN chat_threads ON chat_threads.id = chat_messages.thread_id\n  WHERE chat_messages.thread_id IS NOT NULL\n  GROUP BY chat_messages.thread_id, chat_messages.user_id\n  ORDER BY chat_messages.thread_id ASC, chat_messages.user_id ASC\n) AS thread_participant_stats\nINNER JOIN users ON users.id = thread_participant_stats.user_id\nLEFT JOIN user_chat_thread_memberships ON user_chat_thread_memberships.thread_id = thread_participant_stats.thread_id\n  AND user_chat_thread_memberships.user_id = thread_participant_stats.user_id\nWHERE user_chat_thread_memberships IS NULL\nORDER BY user_chat_thread_memberships.thread_id ASC\nON CONFLICT DO NOTHING;\n")
   -> 0.0009 ثانية
== 20230607091233 BackfillThreadMemberships: اكتملت الهجرة (0.0013 ثانية) ===============

== 20230608163854 CreateSummarySectionsTable: جارٍ الهجرة =======================
-- create_table(:summary_sections)
   -> 0.0060 ثانية
== 20230608163854 CreateSummarySectionsTable: اكتملت الهجرة (0.0064 ثانية) ==============

== 20230612134421 RemoveOldPollsDataFromCustomFields: جارٍ الهجرة ===============
-- execute("DELETE FROM post_custom_fields\nWHERE name LIKE 'polls%'\n")
   -> 0.0004 ثانية
== 20230612134421 RemoveOldPollsDataFromCustomFields: اكتملت الهجرة (0.0007 ثانية) ======

== 20230614011312 RenameDefaultSidebarCategoriesSetting: جارٍ الهجرة ============
-- execute("UPDATE site_settings SET name = 'default_navigation_menu_categories' WHERE name = 'default_sidebar_categories'")
   -> 0.0002 ثانية
== 20230614011312 RenameDefaultSidebarCategoriesSetting: اكتملت الهجرة (0.0005 ثانية) ===

== 20230614011419 RenameDefaultSidebarTagsSetting: جارٍ الهجرة ==================
-- execute("UPDATE site_settings SET name = 'default_navigation_menu_tags' WHERE name = 'default_sidebar_tags'")
   -> 0.0003 ثانية
== 20230614011419 RenameDefaultSidebarTagsSetting: اكتملت الهجرة (0.0007 ثانية) =========

== 20230614041219 DeleteDuplicatePollVotes: جارٍ الهجرة =========================
-- execute("DELETE FROM poll_votes\nWHERE (poll_id, user_id, poll_option_id) IN (\n  SELECT pv.poll_id, pv.user_id, pv.poll_option_id\n  FROM poll_votes pv\n  JOIN polls p ON pv.poll_id = p.id\n  WHERE p.type = 0\n  AND EXISTS (\n    SELECT 1\n    FROM poll_votes pv2\n    WHERE pv.poll_id = pv2.poll_id\n    AND pv.user_id = pv2.user_id\n    AND pv.created_at < pv2.created_at\n  )\n);\n")
   -> 0.0012 ثانية
== 20230614041219 DeleteDuplicatePollVotes: اكتملت الهجرة (0.0016 ثانية) ================

== 20230618041001 AddSidebarLinkToFilteredListToUserOption: جارٍ الهجرة =========
-- add_column(:user_options, :sidebar_link_to_filtered_list, :boolean, {:default=>false, :null=>false})
   -> 0.0007 ثانية
-- execute("UPDATE user_options\nSET sidebar_link_to_filtered_list = true\nWHERE sidebar_list_destination = 1\n")
   -> 0.0003 ثانية
== 20230618041001 AddSidebarLinkToFilteredListToUserOption: اكتملت الهجرة (0.0015 ثانية) 

== 20230618041123 AddSidebarShowCountOfNewItemsToUserOption: جارٍ الهجرة ========
-- add_column(:user_options, :sidebar_show_count_of_new_items, :boolean, {:default=>false, :null=>false})
   -> 0.0007 ثانية
-- execute("UPDATE user_options\nSET sidebar_show_count_of_new_items = true\nWHERE sidebar_list_destination = 1\n")
   -> 0.0003 ثانية
== 20230618041123 AddSidebarShowCountOfNewItemsToUserOption: اكتملت الهجرة (0.0013 ثانية) 

== 20230620050614 RemoveDefaultSidebarListDestinationSetting: جارٍ الهجرة =======
-- execute("DELETE FROM site_settings WHERE name = 'default_sidebar_list_destination'")
   -> 0.0002 ثانية
== 20230620050614 RemoveDefaultSidebarListDestinationSetting: اكتملت الهجرة (0.0005 ثانية) 

== 20230627044755 AddLastViewedAtToUserChatChannelMemberships: جارٍ الهجرة ======
-- add_column(:user_chat_channel_memberships, :last_viewed_at, :datetime, {:null=>false, :default=>#<Proc:0x0000fb5cd76b3868 /var/www/discourse/plugins/chat/db/migrate/20230627044755_add_last_viewed_at_to_user_chat_channel_memberships.rb:9 (lambda)>})
   -> 0.0005 ثانية
== 20230627044755 AddLastViewedAtToUserChatChannelالعضويات: تم الترحيل (0.0008 ثانية)

== 20230627060104 RemoveNewEditSidebarCategoriesTagsInterfaceGroupsSiteSetting: جارٍ الترحيل 
-- execute("DELETE FROM site_settings WHERE name = 'new_edit_sidebar_categories_tags_interface_groups'")
   -> 0.0002 ثانية
== 20230627060104 RemoveNewEditSidebarCategoriesTagsInterfaceGroupsSiteSetting: تم الترحيل (0.0005 ثانية)

== 20230628062236 AddWatchedPrecedenceOverMutedToUserOptions: جارٍ الترحيل =======
-- add_column(:user_options, :watched_precedence_over_muted, :boolean)
   -> 0.0004 ثانية
== 20230628062236 AddWatchedPrecedenceOverMutedToUserOptions: تم الترحيل (0.0014 ثانية)

== 20230703035052 AddStatusToTranslationOverrides: جارٍ الترحيل ==================
-- add_column(:translation_overrides, :original_translation, :text)
   -> 0.0003 ثانية
-- add_column(:translation_overrides, :status, :integer, {:null=>false, :default=>0})
   -> 0.0004 ثانية
== 20230703035052 AddStatusToTranslationOverrides: تم الترحيل (0.0012 ثانية) =========

== 20230707025733 AddLastMessageIdToChannelAndThread: جارٍ الترحيل ===============
-- add_column(:chat_channels, :last_message_id, :bigint, {:null=>true})
   -> 0.0003 ثانية
-- add_column(:chat_threads, :last_message_id, :bigint, {:null=>true})
   -> 0.0003 ثانية
-- add_index(:chat_channels, :last_message_id, {:name=>"index_chat_channels_on_last_message_id"})
   -> 0.0027 ثانية
-- add_index(:chat_threads, :last_message_id, {:name=>"index_chat_threads_on_last_message_id"})
   -> 0.0023 ثانية
== 20230707025733 AddLastMessageIdToChannelAndThread: تم الترحيل (0.0062 ثانية) ======

== 20230707031122 AddWatchedPrecedenceOverMutedIndexToUserOptions: جارٍ الترحيل ==
-- add_index(:user_options, :watched_precedence_over_muted, {:name=>"index_user_options_on_watched_precedence_over_muted"})
   -> 0.0026 ثانية
== 20230707031122 AddWatchedPrecedenceOverMutedIndexToUserOptions: تم الترحيل (0.0031 ثانية)

== 20230707082645 BackfillChatChannelAndThreadLastMessageIds: جارٍ الترحيل =======
-- execute("      UPDATE chat_channels\n      SET last_message_id = (\n        SELECT cm.id\n        FROM chat_messages cm\n        LEFT JOIN chat_threads ON chat_threads.original_message_id = cm.id\n        WHERE cm.chat_channel_id = chat_channels.id\n          AND cm.deleted_at IS NULL\n          AND (cm.thread_id IS NULL OR chat_threads.id IS NOT NULL)\n        ORDER BY cm.created_at DESC, cm.id DESC\n        LIMIT 1\n      );\n")
   -> 0.0008 ثانية
-- execute("      UPDATE chat_threads\n      SET last_message_id = (\n        SELECT cm.id\n        FROM chat_messages cm\n        WHERE cm.thread_id = chat_threads.id\n          AND cm.deleted_at IS NULL\n        ORDER BY cm.created_at DESC, cm.id DESC\n        LIMIT 1\n      );\n")
   -> 0.0003 ثانية
== 20230707082645 BackfillChatChannelAndThreadLastMessageIds: تم الترحيل (0.0015 ثانية)

== 20230708011310 FixReviewableQueuedPostsTargetCreatedById: جارٍ الترحيل ========
-- execute("UPDATE reviewables\nSET target_created_by_id = created_by_id,\n    created_by_id = -1\nWHERE type = 'ReviewableQueuedPost' AND target_created_by_id IS NULL\n")
   -> 0.0004 ثانية
== 20230708011310 FixReviewableQueuedPostsTargetCreatedById: تم الترحيل (0.0007 ثانية)

-- execute("    UPDATE chat_channels\n    SET last_message_id = (\n      SELECT cm.id\n      FROM chat_messages cm\n      LEFT JOIN chat_threads ON chat_threads.original_message_id = cm.id\n      WHERE cm.chat_channel_id = chat_channels.id\n        AND cm.deleted_at IS NULL\n        AND (cm.thread_id IS NULL OR chat_threads.id IS NOT NULL)\n      ORDER BY cm.created_at DESC, cm.id DESC\n      LIMIT 1\n    );\n")
   -> 0.0004 ثانية
-- execute("    UPDATE chat_threads\n    SET last_message_id = (\n      SELECT cm.id\n      FROM chat_messages cm\n      WHERE cm.thread_id = chat_threads.id\n        AND cm.deleted_at IS NULL\n      ORDER BY cm.created_at DESC, cm.id DESC\n      LIMIT 1\n    );\n")
   -> 0.0003 ثانية
== 20230710040640 BackfillChatChannelAndThreadLastMessageIdsPostMigrate: جارٍ الترحيل 
== 20230710040640 BackfillChatChannelAndThreadLastMessageIdsPostMigrate: تم الترحيل (0.0003 ثانية)

== 20230712011946 AddTopicIdNotificationLevelIndexToTopicUsers: جارٍ الترحيل =====
-- add_index(:topic_users, [:topic_id, :notification_level], {:name=>"index_topic_users_on_topic_id_and_notification_level"})
   -> 0.0030 ثانية
== 20230712011946 AddTopicIdNotificationLevelIndexToTopicUsers: تم الترحيل (0.0040 ثانية)

== 20230712013248 AddCategoryIdNotificationLevelIndexToCategoryUsers: جارٍ الترحيل 
-- add_index(:category_users, [:category_id, :notification_level], {:name=>"index_category_users_on_category_id_and_notification_level"})
   -> 0.0024 ثانية
== 20230712013248 AddCategoryIdNotificationLevelIndexToCategoryUsers: تم الترحيل (0.0029 ثانية)

== 20230721025249 RemoveExperimentalSiteSettingForThreads: جارٍ الترحيل ==========
-- execute("DELETE FROM site_settings WHERE name='enable_experimental_chat_threaded_discussions'")
   -> 0.0003 ثانية
== 20230721025249 RemoveExperimentalSiteSettingForThreads: تم الترحيل (0.0006 ثانية) =

== 20230722124044 AddChatSeparateSidebarModeUserOption: جارٍ الترحيل =============
-- add_column(:user_options, :chat_separate_sidebar_mode, :integer, {:default=>0, :null=>false})
   -> 0.0008 ثانية
== 20230722124044 AddChatSeparateSidebarModeUserOption: تم الترحيل (0.0012 ثانية) ====

== 20230727015030 AddIndexTopicIdCreatedAtOnPosts: جارٍ الترحيل ==================
-- remove_index(:posts, [:topic_id, :created_at], {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0042 ثانية
-- add_index(:posts, [:topic_id, :created_at], {:algorithm=>:concurrently, :name=>"index_posts_on_topic_id_and_created_at"})
   -> 0.0034 ثانية
== 20230727015030 AddIndexTopicIdCreatedAtOnPosts: تم الترحيل (0.0081 ثانية) =========

== 20230727015254 ChangeCategorySettingNumAutoBumpDailyDefault: جارٍ الترحيل =====
-- change_column_default(:category_settings, :num_auto_bump_daily, 0)
   -> 0.0015 ثانية
-- execute("WITH custom_fields AS (\n  SELECT\n    category_id,\n    MAX(\n      CASE WHEN (name = 'require_topic_approval')\n      THEN NULLIF(value, '') ELSE NULL END\n    )::boolean AS require_topic_approval,\n    MAX(\n      CASE WHEN (name = 'require_reply_approval')\n      THEN NULLIF(value, '') ELSE NULL END\n    )::boolean AS require_reply_approval,\n    MAX(\n      CASE WHEN (name = 'num_auto_bump_daily')\n      THEN NULLIF(value, '') ELSE NULL END\n    )::integer AS num_auto_bump_daily,\n    NOW() AS created_at,\n    NOW() AS updated_at\n  FROM category_custom_fields\n  WHERE name IN (\n    'require_topic_approval',\n    'require_reply_approval',\n    'num_auto_bump_daily'\n  )\n  GROUP BY category_id\n)\nINSERT INTO\n  category_settings(\n    category_id,\n    require_topic_approval,\n    require_reply_approval,\n    num_auto_bump_daily,\n    created_at,\n    updated_at\n  )\nSELECT * FROM custom_fields\nON CONFLICT (category_id) DO\nUPDATE SET\n  require_topic_approval = EXCLUDED.require_topic_approval,\n  require_reply_approval = EXCLUDED.require_reply_approval,\n  num_auto_bump_daily = EXCLUDED.num_auto_bump_daily,\n  updated_at = NOW()\n")
   -> 0.0005 ثانية
-- execute("UPDATE category_settings\nSET num_auto_bump_daily = 0\nWHERE num_auto_bump_daily IS NULL;\n")
   -> 0.0003 ثانية
== 20230727015254 ChangeCategorySettingNumAutoBumpDailyDefault: تم الترحيل (0.0028 ثانية)

== 20230728055813 DeleteOrphanedDraftUploadReferences: جارٍ الترحيل ==============
-- execute("DELETE\nFROM\n  \"upload_references\"\nWHERE\n  \"upload_references\".\"target_type\" = 'Draft' AND\n  \"upload_references\".\"target_id\" NOT IN (\n    SELECT \"drafts\".\"id\" FROM \"drafts\"\n  )\n")
   -> 0.0007 ثانية
== 20230728055813 DeleteOrphanedDraftUploadReferences: تم الترحيل (0.0011 ثانية) =====

== 20230807033021 AddGroupToWebHookEventType: جارٍ الترحيل =======================
-- add_column(:web_hook_event_types, :group, :integer)
   -> 0.0004 ثانية
== 20230807033021 AddGroupToWebHookEventType: تم الترحيل (0.0007 ثانية) ==============

== 20230807040058 MoveWebHooksToNewEventIds: جارٍ الترحيل ========================
-- execute("INSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 101, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 1;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 102, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 1;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 103, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 1;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 104, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 1;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 105, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 1;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 201, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 2;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 202, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 2;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 203, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 2;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 204, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 2;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 301, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 302, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 303, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 304, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 305, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 306, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 307, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 308, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 309, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 3;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 401, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 4;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 402, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 4;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 403, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 4;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 501, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 5;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 502, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 5;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 503, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 5;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 601, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 6;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 602, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 6;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 603, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 6;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 901, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 9;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 902, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 9;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1001, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 10;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1101, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 11;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1102, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 11;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1201, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 12;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1202, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 12;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1301, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 13;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1302, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 13;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1401, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 14;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1402, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 14;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1501, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 15;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1601, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 16;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1701, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 17;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1702, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 17;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1801, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 18;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1802, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 18;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1803, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 18;\n\nINSERT INTO web_hook_event_types_hooks(web_hook_event_type_id, web_hook_id)\nSELECT 1804, web_hook_id FROM web_hook_event_types_hooks WHERE web_hook_event_types_hooks.web_hook_event_type_id = 18;\n\nDELETE FROM web_hook_event_types WHERE id < 100;\n")
   -> 0.0019 ثانية
== 20230807040058 MoveWebHooksToNewEventIds: تم الترحيل (0.0024 ثانية) ===============

== 20230816211907 IncreaseSizeOfSidebarUrls: جارٍ الترحيل ========================
-- change_column(:sidebar_urls, :value, :string, {:limit=>1000})
   -> 0.0028 ثانية
== 20230816211907 IncreaseSizeOfSidebarUrls: تم الترحيل (0.0033 ثانية) ===============

== 20230817174049 EnsureJavascriptCacheIsUniquePerTheme: جارٍ الترحيل ============
-- remove_index(:javascript_caches, :theme_id)
   -> 0.0022 ثانية
-- add_index(:javascript_caches, :theme_id, {:unique=>true, :name=>"index_javascript_caches_on_theme_id"})
   -> 0.0026 ثانية
-- remove_index(:javascript_caches, :theme_field_id)
   -> 0.0021 ثانية
-- add_index(:javascript_caches, :theme_field_id, {:unique=>true, :name=>"index_javascript_caches_on_theme_field_id"})
   -> 0.0027 ثانية
== 20230817174049 EnsureJavascriptCacheIsUniquePerTheme: تم الترحيل (0.0102 ثانية) ===

== 20230823095931 AddLimitToUserSecondFactorName: جارٍ الترحيل ===================
-- execute("UPDATE user_second_factors\nSET name = LEFT(name, 300)\nWHERE name IS NOT NULL AND LENGTH(name) > 300\n")
   -> 0.0006 ثانية
-- change_column(:user_second_factors, :name, :string, {:limit=>300})
   -> 0.0097 ثانية
== 20230823095931 AddLimitToUserSecondFactorName: تم الترحيل (0.0111 ثانية) ==========

== 20230823100627 AddLimitToUserSecurityKeyName: جارٍ الترحيل ====================
-- execute("UPDATE user_security_keys\nSET name = LEFT(name, 300)\nWHERE name IS NOT NULL AND LENGTH(name) > 300\n")
   -> 0.0007 ثانية
-- change_column(:user_security_keys, :name, :string, {:limit=>300})
   -> 0.0198 ثانية
== 20230823100627 AddLimitToUserSecurityKeyName: تم الترحيل (0.0213 ثانية) ===========

== 20230831153649 DeleteUnusedSiteSettings: جارٍ الترحيل =========================
-- execute("DELETE\nFROM\n  \"site_settings\"\nWHERE\n  \"name\" IN (\n    'rate_limit_new_user_create_topic',\n    'enable_system_avatars',\n    'check_for_new_features',\n    'allow_user_api_keys'\n  )\n")
   -> 0.0003 ثانية
== 20230831153649 DeleteUnusedSiteSettings: تم الترحيل (0.0008 ثانية) ================

== 20230906030920 ChangeAutoSilenceFastTypersSettingToEnumType: جارٍ الترحيل =====
-- execute("UPDATE\n  \"site_settings\"\nSET\n  \"data_type\" = 7\nWHERE\n  \"name\" = 'auto_silence_fast_typers_max_trust_level' AND\n  \"data_type\" = 3\n")
   -> 0.0002 ثانية
== 20230906030920 ChangeAutoSilenceFastTypersSettingToEnumType: تم الترحيل (0.0006 ثانية)

== 20230907225057 CreateThemeSettingsMigrations: جارٍ الترحيل ====================
-- create_table(:theme_settings_migrations)
   -> 0.0068 ثانية
-- add_index(:theme_settings_migrations, [:theme_id, :version], {:unique=>true, :name=>"index_theme_settings_migrations_on_theme_id_and_version"})
   -> 0.0030 ثانية
-- add_index(:theme_settings_migrations, :theme_field_id, {:unique=>true, :name=>"index_theme_settings_migrations_on_theme_field_id"})
   -> 0.0028 ثانية
== 20230907225057 CreateThemeSettingsMigrations: تم الترحيل (0.0133 ثانية) ===========

== 20230910021213 UpdateCategorySettingApprovalValues: جارٍ الترحيل ==============
-- change_column_default(:category_settings, :require_topic_approval, false)
   -> 0.0016 ثانية
-- change_column_default(:category_settings, :require_reply_approval, false)
   -> 0.0013 ثانية
-- execute("WITH custom_fields AS (\n  SELECT\n    category_id,\n    MAX(\n      CASE WHEN (name = 'require_topic_approval')\n      THEN NULLIF(value, '') ELSE NULL END\n    )::boolean AS require_topic_approval,\n    MAX(\n      CASE WHEN (name = 'require_reply_approval')\n      THEN NULLIF(value, '') ELSE NULL END\n    )::boolean AS require_reply_approval,\n    NOW() AS created_at,\n    NOW() AS updated_at\n  FROM category_custom_fields\n  WHERE name IN (\n    'require_topic_approval',\n    'require_reply_approval'\n  )\n  GROUP BY category_id\n)\nINSERT INTO\n  category_settings(\n    category_id,\n    require_topic_approval,\n    require_reply_approval,\n    created_at,\n    updated_at\n  )\nSELECT * FROM custom_fields\nON CONFLICT (category_id) DO\nUPDATE SET\n  require_topic_approval = EXCLUDED.require_topic_approval,\n  require_reply_approval = EXCLUDED.require_reply_approval,\n  updated_at = NOW()\n")
   -> 0.0005 ثانية
-- execute("UPDATE category_settings\nSET require_topic_approval = false\nWHERE require_topic_approval IS NULL;\n")
   -> 0.0002 ثانية
-- execute("UPDATE category_settings\nSET require_reply_approval = false\nWHERE require_reply_approval IS NULL;\n")
   -> 0.0002 ثانية
== 20230910021213 UpdateCategorySettingApprovalValues: تم الترحيل (0.0045 ثانية) =====

== 20230913194832 RenameRevokeApiKeysSettings: جارٍ الترحيل ======================
-- execute("UPDATE site_settings SET name = 'revoke_api_keys_unused_days' where name = 'revoke_api_keys_days'")
   -> 0.0002 ثانية
-- execute("UPDATE site_settings SET name = 'revoke_user_api_keys_unused_days' where name = 'expire_user_api_keys_days'")
   -> 0.0001 ثانية
== 20230913194832 RenameRevokeApiKeysSettings: تم الترحيل (0.0007 ثانية) =============

== 20230926165821 DropPostUploadsTable: جارٍ الترحيل =============================
== 20230926165821 DropPostUploadsTable: تم الترحيل (0.0018 ثانية) ====================

== 20231004020328 MigrateLegacyNavigationMenuSiteSetting: جارٍ الترحيل ===========
-- execute("UPDATE site_settings SET value = 'header dropdown' WHERE name = 'navigation_menu' AND value = 'legacy'")
   -> 0.0004 ثانية
== 20231004020328 MigrateLegacyNavigationMenuSiteSetting: تم الترحيل (0.0009 ثانية) ==

== 20231006160650 AddGroupFieldToDirectMessageChannels: جارٍ الترحيل =============
-- add_column(:direct_message_channels, :group, :boolean, {:default=>false, :null=>false})
   -> 0.0007 ثانية
== 20231006160650 AddGroupFieldToDirectMessageChannels: تم الترحيل (0.0011 ثانية) ====

== 20231006161051 SetMultiusersDirectMessageChannelsAsGroup: جارٍ الترحيل ========
-- execute("      UPDATE direct_message_channels\n      SET \"group\" = true\n      WHERE id IN (\n        SELECT direct_message_channel_id\n        FROM direct_message_users\n        GROUP BY direct_message_channel_id\n        HAVING COUNT(user_id) > 2\n      );\n")
   -> 0.0007 ثانية
== 20231006161051 SetMultiusersDirectMessageChannelsAsGroup: تم الترحيل (0.0011 ثانية)

== 20231017044708 RemoveEnableExperimentalHashtagAutocompleteSetting: جارٍ الترحيل 
-- execute("DELETE FROM site_settings\nWHERE name = 'enable_experimental_hashtag_autocomplete'\n")
   -> 0.0002 ثانية
== 20231017044708 RemoveEnableExperimentalHashtagAutocompleteSetting: تم الترحيل (0.0006 ثانية)

== 20231017175757 ChangeUserGroupMembershipThroughBadgeScriptBadgeNameFieldToBadge: جارٍ الترحيل 
== 20231017175757 ChangeUserGroupMembershipThroughBadgeScriptBadgeNameFieldToBadge: تم الترحيل (0.0009 ثانية)

== 20231018225833 AddDarkModeBackgroundToCategories: جارٍ الترحيل ================
-- add_column(:categories, :uploaded_background_dark_id, :integer, {:index=>true})
   -> 0.0005 ثانية
== 20231018225833 AddDarkModeBackgroundToCategories: تم الترحيل (0.0009 ثانية) =======

== 20231022224833 UpdateCustomFieldData: جارٍ الترحيل ============================
== 20231022224833 UpdateCustomFieldData: تم الترحيل (0.0013 ثانية) ===================

== 20231024034031 MigrateTlToGroupSettingsAnonymousPostingMinTl: جارٍ الترحيل ====
== 20231024034031 MigrateTlToGroupSettingsAnonymousPostingMinTl: تم الترحيل (0.0005 ثانية)

== 20231103060018 FixInvalidTopicUserBookmarkedData: جارٍ الترحيل ================
== 20231103060018 FixInvalidTopicUserBookmarkedData: تم الترحيل (0.0010 ثانية) =======

== 20231107014123 MigrateSharedDraftsMinTrustLevelToGroup: جارٍ الترحيل ==========
== 20231107014123 MigrateSharedDraftsMinTrustLevelToGroup: تم الترحيل (0.0005 ثانية) =

== 20231107055903 MigrateMinTrustLevelForHereMentionToGroup: جارٍ الترحيل ========
== 20231107055903 MigrateMinTrustLevelForHereMentionToGroup: تم الترحيل (0.0006 ثانية)

== 20231110214451 AddsThreadIdToChatDrafts: جارٍ الترحيل =========================
-- add_column(:chat_drafts, :thread_id, :bigint)
   -> 0.0004 ثانية
== 20231110214451 AddsThreadIdToChatDrafts: تم الترحيل (0.0008 ثانية) ================

== 20231111201253 RenameExperimentalPasskeysSiteSetting: جارٍ الترحيل ============
-- execute("UPDATE site_settings SET name = 'enable_passkeys' WHERE name = 'experimental_passkeys'")
   -> 0.0002 ثانية
== 20231111201253 RenameExperimentalPasskeysSiteSetting: تم الترحيل (0.0005 ثانية) ===

== 20231117182638 FillApproveUnlessAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231117182638 FillApproveUnlessAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0004 ثانية)

== 20231120190818 TriggerPostRebakeCategoryStyleQuotes: جارٍ الترحيل =============
== 20231120190818 TriggerPostRebakeCategoryStyleQuotes: تم الترحيل (0.0034 ثانية) ====

== 20231122043756 IncreaseSizeOfTagDescriptions: جارٍ الترحيل ====================
-- change_column(:tags, :description, :string, {:limit=>1000})
   -> 0.0107 ثانية
== 20231122043756 IncreaseSizeOfTagDescriptions: تم الترحيل (0.0113 ثانية) ===========

== 20231122152552 FillNewTopicsUnlessAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231122152552 FillNewTopicsUnlessAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0011 ثانية)

== 20231122212122 FillEmailInAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231122212122 FillEmailInAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0008 ثانية)

== 20231127165331 TriggerAutoLinkingForVideosSincePlaceholder: جارٍ الترحيل ======
== 20231127165331 TriggerAutoLinkingForVideosSincePlaceholder: تم الترحيل (0.0023 ثانية)

== 20231205013029 FillUploadedAvatarsAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231205013029 FillUploadedAvatarsAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0008 ثانية)

== 20231206041353 FillCreateTopicAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231206041353 FillCreateTopicAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20231207011238 FillEditWikiPostAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231207011238 FillEditWikiPostAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20231207135641 AddUserChatThreadMembershipsOnThreadIdUserIdIndex: جارٍ الترحيل 
-- execute("DROP INDEX CONCURRENTLY IF EXISTS idx_user_chat_thread_memberships_on_thread_id_user_id\n")
   -> 0.0002 ثانية
-- execute("CREATE INDEX CONCURRENTLY idx_user_chat_thread_memberships_on_thread_id_user_id\nON user_chat_thread_memberships (thread_id, user_id);\n")
   -> 0.0032 ثانية
== 20231207135641 AddUserChatThreadMembershipsOnThreadIdUserIdIndex: تم الترحيل (0.0043 ثانية)

== 20231212044856 FillEditPostAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231212044856 FillEditPostAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0006 ثانية)

== 20231213060822 FillFlagPostAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231213060822 FillFlagPostAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20231213103248 FillDeleteAllPostsAndTopicsAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231213103248 FillDeleteAllPostsAndTopicsAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20231214020814 FillUserCardBackgroundAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231214020814 FillUserCardBackgroundAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0004 ثانية)

== 20231214023728 FillInviteAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل =
== 20231214023728 FillInviteAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20231214031754 FillIgnoreAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل =
== 20231214031754 FillIgnoreAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0004 ثانية)

== 20231214061615 FillCreateTagAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231214061615 FillCreateTagAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20231214180000 AddChatMentionNotifications: جارٍ الترحيل ======================
-- create_table(:chat_mention_notifications, {:id=>false})
   -> 0.0008 ثانية
-- add_index(:chat_mention_notifications, [:chat_mention_id], {:name=>"index_chat_mention_notifications_on_chat_mention_id"})
   -> 0.0028 ثانية
-- add_index(:chat_mention_notifications, [:notification_id], {:unique=>true, :name=>"index_chat_mention_notifications_on_notification_id"})
   -> 0.0024 ثانية
== 20231214180000 AddChatMentionNotifications: تم الترحيل (0.0066 ثانية) =============

== 20231214180001 UpdateRelationshipBetweenChatMentionsAndNotifications: جارٍ الترحيل 
== 20231214180001 UpdateRelationshipBetweenChatMentionsAndNotifications: تم الترحيل (0.0012 ثانية)

== 20231214180002 UpdateRelationshipBetweenChatMentionsAndNotificationsPostMigrate: جارٍ الترحيل 
== 20231214180002 UpdateRelationshipBetweenChatMentionsAndNotificationsPostMigrate: تم الترحيل (0.0007 ثانية)

== 20231218081901 FillSendEmailMessagesAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231218081901 FillSendEmailMessagesAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20231222030024 FillSelfWikiAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20231222030024 FillSelfWikiAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20231227160001 AddTypeAndTargetIdToChatMentions: جارٍ الترحيل =================
-- add_column(:chat_mentions, :type, :string, {:null=>true})
   -> 0.0030 ثانية
-- add_column(:chat_mentions, :target_id, :integer, {:null=>true})
   -> 0.0003 ثانية
-- change_column_null(:chat_mentions, :user_id, true, nil)
   -> 0.0002 ثانية
== 20231227160001 AddTypeAndTargetIdToChatMentions: تم الترحيل (0.0040 ثانية) ========

== 20231227160002 SetTypeAndTargetIdOnChatMentions: جارٍ الترحيل =================
== 20231227160002 SetTypeAndTargetIdOnChatMentions: تم الترحيل (0.0008 ثانية) ========

== 20231227160003 AddAndRemoveIndexesOnChatMentions: جارٍ الترحيل ================
-- remove_index(:chat_mentions, {:name=>:chat_mentions_index, :algorithm=>:concurrently, :if_exists=>true})
   -> 0.0069 ثانية
-- add_index(:chat_mentions, [:chat_message_id], {:algorithm=>:concurrently, :name=>"index_chat_mentions_on_chat_message_id"})
   -> 0.0030 ثانية
-- add_index(:chat_mentions, [:target_id], {:algorithm=>:concurrently, :name=>"index_chat_mentions_on_target_id"})
   -> 0.0028 ثانية
== 20231227160003 AddAndRemoveIndexesOnChatMentions: تم الترحيل (0.0134 ثانية) =======

== 20231227160004 SetTypeAndTargetIdOnChatMentionsPostMigrate: جارٍ الترحيل ======
== 20231227160004 SetTypeAndTargetIdOnChatMentionsPostMigrate: تم الترحيل (0.0010 ثانية)

== 20231227160005 MakeTypeOnChatMentionsNonNullable: جارٍ الترحيل ================
-- change_column_null(:chat_mentions, :type, false, nil)
   -> 0.0003 ثانية
== 20231227160005 MakeTypeOnChatMentionsNonNullable: تم الترحيل (0.0007 ثانية) =======

== 20240104155715 AddEmbedContentCacheToTopicEmbed: جارٍ الترحيل =================
-- add_column(:topic_embeds, :embed_content_cache, :text)
   -> 0.0004 ثانية
== 20240104155715 AddEmbedContentCacheToTopicEmbed: تم الترحيل (0.0008 ثانية) ========

== 20240108022138 ChangeEnableAdminSidebarToGroupPostMigration: جارٍ الترحيل =====
== 20240108022138 ChangeEnableAdminSidebarToGroupPostMigration: تم الترحيل (0.0005 ثانية)

== 20240110040813 FillSkipReviewMediaGroupsBasedOnDeprecatedSetting: جارٍ الترحيل 
== 20240110040813 FillSkipReviewMediaGroupsBasedOnDeprecatedSetting: تم الترحيل (0.0005 ثانية)

== 20240112021335 SetMaxCleanOrphanUploadsGracePeriodHours: جارٍ الترحيل =========
== 20240112021335 SetMaxCleanOrphanUploadsGracePeriodHours: تم الترحيل (0.0004 ثانية)

== 20240112043325 FillEmbeddedMediaPostAllowedGroupsBasedOnDeprecatedSetting: جارٍ الترحيل 
== 20240112043325 FillEmbeddedMediaPostAllowedGroupsBasedOnDeprecatedSetting: تم الترحيل (0.0005 ثانية)

== 20240112073149 FillTagTopicAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20240112073149 FillTagTopicAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005 ثانية)

== 20240116043702 CreateTopicHotScores: جارٍ الترحيل =============================
-- create_table(:topic_hot_scores)
   -> 0.0046 ثانية
-- add_index(:topic_hot_scores, :topic_id, {:unique=>true, :name=>"index_topic_hot_scores_on_topic_id"})
   -> 0.0025 ثانية
-- add_index(:topic_hot_scores, [:score, :topic_id], {:unique=>true, :name=>"index_topic_hot_scores_on_score_and_topic_id"})
   -> 0.0025 ثانية
== 20240116043702 CreateTopicHotScores: تم الترحيل (0.0103 ثانية) ====================== 20240116182229 MigrateLazyLoadCategoriesToGroups: جارٍ الترحيل ================
-- execute("UPDATE site_settings\nSET name = 'lazy_load_categories_groups', data_type = 20, value = '0'\nWHERE name = 'lazy_load_categories' AND value = 't'\n")
   -> 0.0003s
-- execute("UPDATE site_settings\nSET name = 'lazy_load_categories_groups', data_type = 20, value = ''\nWHERE name = 'lazy_load_categories' AND value = 'f'\n")
   -> 0.0002s
== 20240116182229 MigrateLazyLoadCategoriesToGroups: تم الترحيل (0.0009s) =======

== 20240117090801 FillPostLinksAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20240117090801 FillPostLinksAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005s) 

== 20240117093148 FillUserApiKeyAllowedGroupsBasedOnDeprecatedSettings: جارٍ الترحيل 
== 20240117093148 FillUserApiKeyAllowedGroupsBasedOnDeprecatedSettings: تم الترحيل (0.0005s) 

== 20240118120825 AddThreadsEnabledSiteSetting: جارٍ الترحيل =====================
== 20240118120825 AddThreadsEnabledSiteSetting: تم الترحيل (0.0023s) ============

== 20240122015626 FillPollCreateAllowedGroupsBasedOnDeprecatedSetting: جارٍ الترحيل 
== 20240122015626 FillPollCreateAllowedGroupsBasedOnDeprecatedSetting: تم الترحيل (0.0070s) 

== 20240122015630 FillStyleguideAdminOnlyGroups: جارٍ الترحيل ====================
== 20240122015630 FillStyleguideAdminOnlyGroups: تم الترحيل (0.0015s) ===========

== 20240201170412 FixTagTopicAllowedGroupsSetting: جارٍ الترحيل ==================
== 20240201170412 FixTagTopicAllowedGroupsSetting: تم الترحيل (0.0013s) =========

== 20240202032242 AddJsonValueToThemeSettings: جارٍ الترحيل ======================
-- add_column(:theme_settings, :json_value, :jsonb)
   -> 0.0010s
== 20240202032242 AddJsonValueToThemeSettings: تم الترحيل (0.0015s) =============

== 20240202052058 DropBadgeImageColumn: جارٍ الترحيل =============================
== 20240202052058 DropBadgeImageColumn: تم الترحيل (0.0016s) ====================

== 20240202204030 FixHereMentionAllowedGroupsSetting: جارٍ الترحيل ===============
== 20240202204030 FixHereMentionAllowedGroupsSetting: تم الترحيل (0.0008s) ======

== 20240204204532 AddUserToPermalink: جارٍ الترحيل ===============================
-- add_column(:permalinks, :user_id, :integer)
   -> 0.0004s
== 20240204204532 AddUserToPermalink: تم الترحيل (0.0009s) ======================

== 20240212034010 DropDeprecatedColumns: جارٍ الترحيل ============================
== 20240212034010 DropDeprecatedColumns: تم الترحيل (0.0152s) ===================

== 20240213175713 AddStreamingToMessage: جارٍ الترحيل ============================
-- add_column(:chat_messages, :streaming, :boolean, {:null=>false, :default=>false})
   -> 0.0007s
== 20240213175713 AddStreamingToMessage: تم الترحيل (0.0011s) ===================

== 20240214135517 FixChatChannelSlugIndex: جارٍ الترحيل ==========================
-- remove_index(:chat_channels, :slug)
   -> 0.0028s
-- add_index(:chat_channels, :slug, {:unique=>true, :where=>"slug != ''", :name=>"index_chat_channels_on_slug"})
   -> 0.0052s
== 20240214135517 FixChatChannelSlugIndex: تم الترحيل (0.0086s) =================

== 20240216073624 FillProfileBackgroundAllowedGroupsBasedOnDeprecatedSetting: جارٍ الترحيل 
== 20240216073624 FillProfileBackgroundAllowedGroupsBasedOnDeprecatedSetting: تم الترحيل (0.0008s) 

== 20240219012001 RemoveEnableExperimentalAdminUiGroupsSiteSettings: جارٍ الترحيل 
-- execute("DELETE FROM site_settings WHERE name = 'enable_experimental_admin_ui_groups'")
   -> 0.0002s
== 20240219012001 RemoveEnableExperimentalAdminUiGroupsSiteSettings: تم الترحيل (0.0006s) 

== 20240223052820 CreateProblemCheckTrackers: جارٍ الترحيل =======================
-- create_table(:problem_check_trackers)
   -> 0.0092s
== 20240223052820 CreateProblemCheckTrackers: تم الترحيل (0.0097s) ==============

== 20240301033753 DeleteOldBookmarkReminderSetting: جارٍ الترحيل =================
== 20240301033753 DeleteOldBookmarkReminderSetting: تم الترحيل (0.0006s) ========

== 20240301100413 AddForceToThreads: جارٍ الترحيل ================================
-- add_column(:chat_threads, :force, :boolean, {:null=>false, :default=>false})
   -> 0.0006s
== 20240301100413 AddForceToThreads: تم الترحيل (0.0010s) =======================

== 20240304030429 TopicIdOnIncomingEmailIndex: جارٍ الترحيل ======================
-- remove_index(:incoming_emails, :topic_id, {:if_exists=>true})
   -> 0.0029s
-- add_index(:incoming_emails, :topic_id, {:algorithm=>:concurrently, :name=>"index_incoming_emails_on_topic_id"})
   -> 0.0031s
== 20240304030429 TopicIdOnIncomingEmailIndex: تم الترحيل (0.0066s) =============

== 20240306063428 AddIndexesToNotifications: جارٍ الترحيل ========================
-- execute("DROP INDEX IF EXISTS index_notifications_user_menu_ordering\n")
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY index_notifications_user_menu_ordering\nON notifications (\n  user_id,\n  (high_priority AND NOT read) DESC,\n  (NOT read) DESC,\n  created_at DESC\n);\n")
   -> 0.0035s
-- execute("DROP INDEX IF EXISTS index_notifications_user_menu_ordering_deprioritized_likes\n")
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY index_notifications_user_menu_ordering_deprioritized_likes\nON notifications (\n  user_id,\n  (high_priority AND NOT read) DESC,\n  (NOT read AND notification_type NOT IN (5,19,25)) DESC,\n  created_at DESC\n);\n")
   -> 0.0038s
== 20240306063428 AddIndexesToNotifications: تم الترحيل (0.0083s) ===============

== 20240307231053 AddTopicsUnreadWhenClosedToUserOptions: جارٍ الترحيل ===========
-- add_column(:user_options, :topics_unread_when_closed, :boolean, {:default=>true, :null=>false})
   -> 0.0008s
== 20240307231053 AddTopicsUnreadWhenClosedToUserOptions: تم الترحيل (0.0012s) ==

== 20240311015942 CreateAdminNotices: جارٍ الترحيل ===============================
-- create_table(:admin_notices)
   -> 0.0121s
== 20240311015942 CreateAdminNotices: تم الترحيل (0.0127s) ======================

== 20240326200232 AddCustomHomepageThemeModifiers: جارٍ الترحيل ==================
-- add_column(:theme_modifier_sets, :custom_homepage, :boolean, {:null=>true})
   -> 0.0004s
== 20240326200232 AddCustomHomepageThemeModifiers: تم الترحيل (0.0009s) =========

== 20240327000440 ReplacePostReplyIndex: جارٍ الترحيل ============================
-- execute("DROP INDEX CONCURRENTLY IF EXISTS \"index_posts_on_topic_id_and_reply_to_post_number\"\n")
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY IF NOT EXISTS \"index_posts_on_topic_id_and_reply_to_post_number\"\nON \"posts\" (\"topic_id\", \"reply_to_post_number\")\n")
   -> 0.0036s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS \"index_posts_on_reply_to_post_number\"\n")
   -> 0.0047s
== 20240327000440 ReplacePostReplyIndex: تم الترحيل (0.0092s) ===================

== 20240327043323 DisableAdminSidebarForExistingSites: جارٍ الترحيل ==============
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('admin_sidebar_enabled_groups', 20, '-1', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0003s
== 20240327043323 DisableAdminSidebarForExistingSites: تم الترحيل (0.0012s) =====

== 20240401054228 AddDetailsToProblemCheckTrackers: جارٍ الترحيل =================
-- add_column(:problem_check_trackers, :details, :json, {:default=>{}})
   -> 0.0006s
== 20240401054228 AddDetailsToProblemCheckTrackers: تم الترحيل (0.0010s) ========

== 20240404034232 RemoveExperimentalObjectsTypeForThemeSettings: جارٍ الترحيل ====
-- execute("DELETE FROM site_settings WHERE name = 'experimental_objects_type_for_theme_settings'")
   -> 0.0002s
== 20240404034232 RemoveExperimentalObjectsTypeForThemeSettings: تم الترحيل (0.0005s) 

== 20240408140000 DropNotificationIdFromChatMentions: جارٍ الترحيل ===============
== 20240408140000 DropNotificationIdFromChatMentions: تم الترحيل (0.0013s) ======

== 20240409060201 AddThreadTitlePromptToUserChatThreadMemberships: جارٍ الترحيل ==
-- add_column(:user_chat_thread_memberships, :thread_title_prompt_seen, :boolean, {:default=>false, :null=>false})
   -> 0.0005s
== 20240409060201 AddThreadTitlePromptToUserChatThreadMemberships: تم الترحيل (0.0009s) 

== 20240409093348 AddShowThreadTitlePromptsToUserOptions: جارٍ الترحيل ===========
-- add_column(:user_options, :show_thread_title_prompts, :boolean)
   -> 0.0004s
== 20240409093348 AddShowThreadTitlePromptsToUserOptions: تم الترحيل (0.0008s) ==

== 20240410130000 DropUserIdFromChatMentions: جارٍ الترحيل =======================
== 20240410130000 DropUserIdFromChatMentions: تم الترحيل (0.0011s) ==============

== 20240416105733 AddRankToPollVotes: جارٍ الترحيل ===============================
-- add_column(:poll_votes, :rank, :integer, {:null=>false, :default=>0})
   -> 0.0005s
== 20240416105733 AddRankToPollVotes: تم الترحيل (0.0008s) ======================

== 20240422015830 RemoveAdminGuideTooltipFromSeenPopups: جارٍ الترحيل ============
-- execute("UPDATE user_options SET seen_popups = ARRAY_REMOVE(user_options2.seen_popups, 6)\nFROM (SELECT user_id, seen_popups FROM user_options) AS user_options2\nWHERE 6 = ANY (user_options.seen_popups)\n  AND user_options.user_id = user_options2.user_id\n")
   -> 0.0006s
== 20240422015830 RemoveAdminGuideTooltipFromSeenPopups: تم الترحيل (0.0010s) ===

== 20240422042830 AddExcerptToChatMessages: جارٍ الترحيل =========================
-- add_column(:chat_messages, :excerpt, :string, {:limit=>1000, :null=>true})
   -> 0.0003s
== 20240422042830 AddExcerptToChatMessages: تم الترحيل (0.0007s) ================

== 20240423013808 AddVisibilityReasonIdToTopics: جارٍ الترحيل ====================
-- add_column(:topics, :visibility_reason_id, :integer)
   -> 0.0004s
== 20240423013808 AddVisibilityReasonIdToTopics: تم الترحيل (0.0007s) ===========

== 20240423054323 CreateFlags: جارٍ الترحيل ======================================
-- create_table(:flags)
   -> 0.0072s
== 20240423054323 CreateFlags: تم الترحيل (0.0089s) =============================

== 20240425133407 DropChatChannelsLastMessageSentAt: جارٍ الترحيل ================
== 20240425133407 DropChatChannelsLastMessageSentAt: تم الترحيل (0.0017s) =======

== 20240430051551 AddUserIdToEmbeddableHosts: جارٍ الترحيل =======================
-- add_column(:embeddable_hosts, :user_id, :integer)
   -> 0.0004s
== 20240430051551 AddUserIdToEmbeddableHosts: تم الترحيل (0.0007s) ==============

== 20240430052017 CreateEmbeddableHostTags: جارٍ الترحيل =========================
-- create_table(:embeddable_host_tags)
   -> 0.0039s
-- add_index(:embeddable_host_tags, :embeddable_host_id, {:name=>"index_embeddable_host_tags_on_embeddable_host_id"})
   -> 0.0027s
-- add_index(:embeddable_host_tags, :tag_id, {:name=>"index_embeddable_host_tags_on_tag_id"})
   -> 0.0026s
-- add_index(:embeddable_host_tags, [:embeddable_host_id, :tag_id], {:unique=>true, :name=>"index_embeddable_host_tags_on_embeddable_host_id_and_tag_id"})
   -> 0.0026s
== 20240430052017 CreateEmbeddableHostTags: تم الترحيل (0.0125s) ================

== 20240430185434 FixWatchedWordsWithoutAction: جارٍ الترحيل =====================
-- execute("UPDATE watched_words\nSET action = 2\nWHERE action = 0\nAND LENGTH(COALESCE(replacement, '')) = 0\n")
   -> 0.0005s
-- execute("UPDATE watched_words\nSET action = 5\nWHERE action = 0\n")
   -> 0.0002s
-- execute("UPDATE watched_word_groups\nSET action = ww.action\nFROM watched_words ww\nWHERE ww.watched_word_group_id = watched_word_groups.id\nAND ww.action != 0\nAND watched_word_groups.action = 0\n")
   -> 0.0004s
== 20240430185434 FixWatchedWordsWithoutAction: تم الترحيل (0.0015s) ============

== 20240506035024 ClearOrphanedDraftUploadReferences: جارٍ الترحيل ===============
-- execute("DELETE\nFROM\n  \"upload_references\"\nWHERE\n  \"upload_references\".\"target_type\" = 'Draft' AND\n  \"upload_references\".\"target_id\" NOT IN (\n    SELECT \"drafts\".\"id\" FROM \"drafts\"\n  )\n")
   -> 0.0003s
== 20240506035024 ClearOrphanedDraftUploadReferences: تم الترحيل (0.0006s) ======

== 20240506125839 AddHtmlToWatchedWords: جارٍ الترحيل ============================
-- add_column(:watched_words, :html, :boolean, {:default=>false, :null=>false})
   -> 0.0006s
== 20240506125839 AddHtmlToWatchedWords: تم الترحيل (0.0010s) ===================

== 20240507112651 SwitchTopicAutomationCustomFieldsToJson: جارٍ الترحيل ==========
-- execute("DELETE FROM topic_custom_fields\nWHERE name = 'discourse_automation_ids'\n")
   -> 0.0002s
== 20240507112651 SwitchTopicAutomationCustomFieldsToJson: تم الترحيل (0.0010s) =

== 20240507112751 SwitchUserAutomationCustomFieldsToJson: جارٍ الترحيل ===========
-- execute("DELETE FROM user_custom_fields\nWHERE name = 'discourse_automation_ids'\n")
   -> 0.0002s
== 20240507112751 SwitchUserAutomationCustomFieldsToJson: تم الترحيل (0.0010s) ==

== 20240507112851 SwitchTopicAutomationTriggeredIdsCustomFieldsToJson: جارٍ الترحيل 
-- execute("DELETE FROM topic_custom_fields\nWHERE name = 'auto_responder_triggered_ids'\n")
   -> 0.0002s
== 20240507112851 SwitchTopicAutomationTriggeredIdsCustomFieldsToJson: تم الترحيل (0.0007s) 

== 20240507112951 DropAutomationIdsCustomFieldIndexes: جارٍ الترحيل ==============
-- remove_index(:topic_custom_fields, {:name=>:idx_topic_custom_fields_discourse_automation_unique_id_partial, :if_exists=>true})
   -> 0.0043s
-- remove_index(:user_custom_fields, {:name=>:idx_user_custom_fields_discourse_automation_unique_id_partial, :if_exists=>true})
   -> 0.0032s
-- remove_index(:post_custom_fields, {:name=>:idx_post_custom_fields_discourse_automation_unique_id_partial, :if_exists=>true})
   -> 0.0048s
== 20240507112951 DropAutomationIdsCustomFieldIndexes: تم الترحيل (0.0128s) =====

== 20240510073417 IncreaseExternalAvatarUrlLimit: جارٍ الترحيل ===================
-- change_column(:single_sign_on_records, :external_avatar_url, :string, {:limit=>1500})
   -> 0.0005s
== 20240510073417 IncreaseExternalAvatarUrlLimit: تم الترحيل (0.0010s) ==========

== 20240516145911 UpdateUserOptionsForThreadTitlePrompts: جارٍ الترحيل ===========
-- change_column_default(:user_options, :show_thread_title_prompts, true)
   -> 0.0036s
-- change_column_null(:user_options, :show_thread_title_prompts, false, nil)
   -> 0.0004s
== 20240516145911 UpdateUserOptionsForThreadTitlePrompts: تم الترحيل (0.0068s) ==

== 20240517014119 AddTargetToProblemCheckTrackers: جارٍ الترحيل ==================
-- add_column(:problem_check_trackers, :target, :string, {:null=>true})
   -> 0.0004s
== 20240517014119 AddTargetToProblemCheckTrackers: تم الترحيل (0.0008s) =========

== 20240517051933 DisambiguateProblemCheckTrackerUniqueness: جارٍ الترحيل ========
-- remove_index(:problem_check_trackers, {:name=>"index_problem_check_trackers_on_identifier"})
   -> 0.0004s
-- add_index(:problem_check_trackers, [:identifier, :target], {:unique=>true, :name=>"index_problem_check_trackers_on_identifier_and_target"})
   -> 0.0031s
== 20240517051933 DisambiguateProblemCheckTrackerUniqueness: تم الترحيل (0.0040s) 

== 20240520060901 AddRequirementToUserFields: جارٍ الترحيل =======================
-- add_column(:user_fields, :requirement, :integer, {:null=>false, :default=>0})
   -> 0.0008s
-- execute("UPDATE user_fields\nSET requirement =\n  (CASE WHEN required IS NOT TRUE THEN 0 ELSE 2 END)\n")
   -> 0.0003s
== 20240520060901 AddRequirementToUserFields: تم الترحيل (0.0018s) ==============

== 20240527015009 AddTopicViewStats: جارٍ الترحيل ================================
-- create_table(:topic_view_stats)
   -> 0.0043s
-- add_index(:topic_view_stats, [:topic_id, :viewed_at], {:unique=>true, :name=>"index_topic_view_stats_on_topic_id_and_viewed_at"})
   -> 0.0027s
-- add_index(:topic_view_stats, [:viewed_at, :topic_id], {:name=>"index_topic_view_stats_on_viewed_at_and_topic_id"})
   -> 0.0022s
== 20240527015009 AddTopicViewStats: تم الترحيل (0.0099s) =======================

== 20240527055057 AddScoreTypeToFlags: جارٍ الترحيل ==============================
-- add_column(:flags, :score_type, :boolean, {:default=>false, :null=>false})
   -> 0.0006s
== 20240527055057 AddScoreTypeToFlags: تم الترحيل (0.0010s) =====================

== 20240531053226 CreateUserRequiredFieldsVersion: جارٍ الترحيل ==================
-- create_table(:user_required_fields_versions)
   -> 0.0034s
-- add_column(:users, :required_fields_version, :integer)
   -> 0.0004s
== 20240531053226 CreateUserRequiredFieldsVersion: تم الترحيل (0.0043s) =========

== 20240603234529 CreateUserPasswords: جارٍ الترحيل ==============================
-- create_table(:user_passwords, {:id=>:integer})
   -> 0.0037s
-- add_index(:user_passwords, [:user_id], {:unique=>true, :where=>"password_expired_at IS NULL", :name=>"index_user_passwords_on_user_id"})
   -> 0.0039s
-- add_index(:user_passwords, [:user_id, :password_hash], {:unique=>true, :name=>"index_user_passwords_on_user_id_and_password_hash"})
   -> 0.0022s
-- add_index(:user_passwords, [:user_id, :password_expired_at, :password_hash], {:name=>"idx_user_passwords_on_user_id_and_expired_at_and_hash"})
   -> 0.0022s
== 20240603234529 CreateUserPasswords: تم الترحيل (0.0127s) =====================

== 20240606003822 ReorderFlags: جارٍ الترحيل =====================================
== 20240606003822 ReorderFlags: تم الترحيل (0.0008s) ============================

== 20240610150449 LimitTagGroupNameLength: جارٍ الترحيل ==========================
-- change_column(:tag_groups, :name, :string, {:limit=>100})
   -> 0.0030s
== 20240610150449 LimitTagGroupNameLength: تم الترحيل (0.0037s) =================

== 20240612063735 AddFieldTypeEnumToUserFields: جارٍ الترحيل =====================
-- add_column(:user_fields, :field_type_enum, :integer)
   -> 0.0005s
-- execute("UPDATE user_fields\nSET field_type_enum =\n  CASE\n    WHEN field_type = 'text' THEN 0\n    WHEN field_type = 'confirm' THEN 1\n    WHEN field_type = 'dropdown' THEN 2\n    WHEN field_type = 'multiselect' THEN 3\n  END\n")
   -> 0.0003s
-- change_column_null(:user_fields, :field_type, true, nil)
   -> 0.0002s
-- change_column_null(:user_fields, :field_type_enum, false, nil)
   -> 0.0002s
== 20240612063735 AddFieldTypeEnumToUserFields: تم الترحيل (0.0019s) ============

== 20240612073116 SwapFieldTypeWithFieldTypeEnumOnUserFields: جارٍ الترحيل =======
== 20240612073116 SwapFieldTypeWithFieldTypeEnumOnUserFields: تم الترحيل (0.0003s) 

== 20240619123052 CreateWebHookEventsDailyAggregates: جارٍ الترحيل ===============
-- create_table(:web_hook_events_daily_aggregates)
   -> 0.0064s
== 20240619123052 CreateWebHookEventsDailyAggregates: تم الترحيل (0.0068s) ======

== 20240620024938 AddBackFieldTypeEnumToUserFields: جارٍ الترحيل =================
== 20240620024938 AddBackFieldTypeEnumToUserFields: تم الترحيل (0.0020s) ========

== 20240627125112 RemoveInvalidCspScriptSrcSiteSettingValues: جارٍ الترحيل =======
== 20240627125112 RemoveInvalidCspScriptSrcSiteSettingValues: تم الترحيل (0.0006s) 

== 20240627155730 CreateRedeliveringWebhookEvents: جارٍ الترحيل ==================
-- create_table(:redelivering_webhook_events)
   -> 0.0062s
== 20240627155730 CreateRedeliveringWebhookEvents: تم الترحيل (0.0067s) =========

== 20240705134114 ClearOrphanedDraftUploadReferences2: جارٍ الترحيل ==============
-- execute("DELETE\nFROM\n  \"upload_references\"\nWHERE\n  \"upload_references\".\"target_type\" = 'Draft' AND\n  \"upload_references\".\"target_id\" NOT IN (\n    SELECT \"drafts\".\"id\" FROM \"drafts\"\n  )\n")
   -> 0.0003s
== 20240705134114 ClearOrphanedDraftUploadReferences2: تم الترحيل (0.0007s) =====

== 20240705153533 AddUserAgentToSearchLogs: جارٍ الترحيل =========================
-- add_column(:search_logs, :user_agent, :string, {:null=>true, :limit=>2000})
   -> 0.0004s
== 20240705153533 AddUserAgentToSearchLogs: تم الترحيل (0.0008s) ================

== 20240709010639 RemoveCrossOriginUnsafeNoneReferrersSetting: جارٍ الترحيل ======
-- execute("DELETE FROM site_settings\nWHERE name = 'cross_origin_opener_unsafe_none_referrers'\n")
   -> 0.0002s
== 20240709010639 RemoveCrossOriginUnsafeNoneReferrersSetting: تم الترحيل (0.0006s) 

== 20240709015048 RemoveLoggingProviderSiteSetting: جارٍ الترحيل =================
-- execute("DELETE FROM site_settings WHERE name = 'logging_provider'")
   -> 0.0002s
== 20240709015048 RemoveLoggingProviderSiteSetting: تم الترحيل (0.0005s) ========

== 20240711123755 DropCompiledJsFromTranslationOverrides: جارٍ الترحيل ===========
== 20240711123755 DropCompiledJsFromTranslationOverrides: تم الترحيل (0.0015s) ==

== 20240711153837 AddCreatedBySdkToChatMessages: جارٍ الترحيل ====================
-- add_column(:chat_messages, :created_by_sdk, :boolean)
   -> 0.0004s
== 20240711153837 AddCreatedBySdkToChatMessages: تم الترحيل (0.0008s) ===========

== 20240711154622 UpdateChatMessagesCreatedBySdk: جارٍ الترحيل ===================
-- change_column_default(:chat_messages, :created_by_sdk, false)
   -> 0.0020s
-- change_column_null(:chat_messages, :created_by_sdk, false)
   -> 0.0003s
== 20240711154622 UpdateChatMessagesCreatedBySdk: تم الترحيل (0.0031s) ==========

== 20240712050324 DefaultGithubOneboxToken: جارٍ الترحيل =========================
-- execute("DELETE FROM site_settings WHERE name = 'github_onebox_access_token'\n")
   -> 0.0002s
== 20240712050324 DefaultGithubOneboxToken: تم الترحيل (0.0008s) ================

== 20240714231226 DuplicateFlagsCustomTypeToRequireMessage: migrating =========
-- add_column(:flags, :require_message, :boolean, {:default=>false, :null=>false})
   -> 0.0007s
== 20240714231226 DuplicateFlagsCustomTypeToRequireMessage: migrated (0.0012s) 

== 20240714231516 DropCustomTypeFromFlags: migrating ==========================
== 20240714231516 DropCustomTypeFromFlags: migrated (0.0015s) =================

== 20240715073605 AddSmtpSslModeToGroups: migrating ===========================
-- add_column(:groups, :smtp_ssl_mode, :integer, {:default=>0, :null=>false})
   -> 0.0006s
-- execute("UPDATE groups SET smtp_ssl_mode = (CASE WHEN smtp_ssl THEN 2 ELSE 0 END)\n")
   -> 0.0003s
== 20240715073605 AddSmtpSslModeToGroups: migrated (0.0049s) ==================

== 20240717053710 DropGroupsSmtpSsl: migrating ================================
== 20240717053710 DropGroupsSmtpSsl: migrated (0.0015s) =======================

== 20240717171840 RenameChatPreferredMobileIndexSetting: migrating ============
-- execute("UPDATE site_settings SET name = 'chat_preferred_index' WHERE name = 'chat_preferred_mobile_index'")
   -> 0.0002s
== 20240717171840 RenameChatPreferredMobileIndexSetting: migrated (0.0006s) ===

== 20240722025822 AddUserIdToCustomEmojis: migrating ==========================
-- add_column(:custom_emojis, :user_id, :integer, {:null=>false, :default=>-1})
   -> 0.0006s
== 20240722025822 AddUserIdToCustomEmojis: migrated (0.0010s) =================

== 20240723030506 AddPostIdIndexToUserHistories: migrating ====================
-- remove_index(:user_histories, :post_id, {:if_exists=>true})
   -> 0.0027s
-- add_index(:user_histories, :post_id, {:algorithm=>:concurrently})
   -> 0.0037s
== 20240723030506 AddPostIdIndexToUserHistories: migrated (0.0070s) ===========

== 20240724021732 AddLoginMethodToUserAuthTokens: migrating ===================
-- add_column(:user_auth_tokens, :authenticated_with_oauth, :boolean, {:default=>false})
   -> 0.0006s
== 20240724021732 AddLoginMethodToUserAuthTokens: migrated (0.0010s) ==========

== 20240725042522 RemoveExperimentalFlagsAdminPageSiteSetting: migrating ======
-- execute("DELETE FROM site_settings WHERE name = 'experimental_flags_admin_page_enabled_groups'")
   -> 0.0002s
== 20240725042522 RemoveExperimentalFlagsAdminPageSiteSetting: migrated (0.0005s) 

== 20240729084803 CreateUserApiKeyClients: migrating ==========================
-- create_table(:user_api_key_clients)
   -> 0.0059s
-- add_index(:user_api_key_clients, [:client_id], {:unique=>true})
   -> 0.0024s
-- execute("INSERT INTO user_api_key_clients (client_id, application_name, created_at, updated_at)\n             SELECT client_id, application_name, created_at, updated_at\n             FROM user_api_keys")
   -> 0.0005s
-- add_column(:user_api_keys, :user_api_key_client_id, :bigint, {:null=>true})
   -> 0.0004s
-- add_index(:user_api_keys, :user_api_key_client_id)
   -> 0.0024s
-- execute("UPDATE user_api_keys keys\n             SET user_api_key_client_id = clients.id\n             FROM user_api_key_clients clients\n             WHERE clients.client_id = keys.client_id")
   -> 0.0006s
-- change_column_null(:user_api_keys, :client_id, true)
   -> 0.0003s
-- change_column_null(:user_api_keys, :application_name, true)
   -> 0.0002s
== 20240729084803 CreateUserApiKeyClients: migrated (0.0133s) =================

== 20240731143458 RemoveChatDefaultChannelId: migrating =======================
-- execute("DELETE FROM site_settings WHERE name = 'chat_default_channel_id'")
   -> 0.0002s
== 20240731143458 RemoveChatDefaultChannelId: migrated (0.0005s) ==============

== 20240731190511 UpdateInvalidAllowedIframeValues: migrating =================
== 20240731190511 UpdateInvalidAllowedIframeValues: migrated (0.0005s) ========

== 20240807024301 UpdateDeleteMergedStubTopicsAfterDaysSetting: migrating =====
-- execute("UPDATE site_settings SET value = '-1' WHERE name = 'delete_merged_stub_topics_after_days' AND value = '0'")
   -> 0.0002s
== 20240807024301 UpdateDeleteMergedStubTopicsAfterDaysSetting: migrated (0.0005s) 

== 20240815234500 RemoveGlimmerHeaderModeSetting: migrating ===================
-- execute("DELETE FROM site_settings\nWHERE name = 'glimmer_header_mode'\n")
   -> 0.0002s
== 20240815234500 RemoveGlimmerHeaderModeSetting: migrated (0.0005s) ==========

== 20240818113758 RemoveAllButMostRecentUserPassword: migrating ===============
-- execute("DELETE FROM user_passwords WHERE id NOT IN ( SELECT DISTINCT ON (user_id) id FROM user_passwords ORDER BY user_id, password_expired_at DESC NULLS FIRST );")
   -> 0.0006s
== 20240818113758 RemoveAllButMostRecentUserPassword: migrated (0.0010s) ======

== 20240819130737 UpdateUniqueIndexOnUserPasswords: migrating =================
-- remove_index(:user_passwords, [:user_id], {:unique=>true, :where=>"password_expired_at IS NULL", :algorithm=>:concurrently, :if_exists=>true})
   -> 0.0078s
-- add_index(:user_passwords, [:user_id], {:unique=>true, :algorithm=>:concurrently, :if_not_exists=>true})
   -> 0.0033s
== 20240819130737 UpdateUniqueIndexOnUserPasswords: migrated (0.0118s) ========

== 20240820123401 AlterNotificationsIdSequenceToBigint: migrating =============
-- execute("ALTER SEQUENCE notifications_id_seq AS bigint")
   -> 0.0004s
== 20240820123401 AlterNotificationsIdSequenceToBigint: migrated (0.0008s) ====

== 20240820123402 AddBigIntNotificationsId: migrating =========================
-- execute("SELECT data_type FROM information_schema.columns WHERE table_name = 'notifications' AND column_name = 'id' LIMIT 1")
   -> 0.0023s
-- execute("ALTER TABLE notifications ADD COLUMN new_id BIGINT NOT NULL DEFAULT 0")
   -> 0.0005s
-- execute("CREATE FUNCTION mirror_notifications_id() RETURNS trigger AS $$ BEGIN NEW.new_id = NEW.id; RETURN NEW; END; $$ LANGUAGE plpgsql")
   -> 0.0004s
-- execute("CREATE TRIGGER notifications_new_id_trigger BEFORE INSERT ON notifications FOR EACH ROW EXECUTE PROCEDURE mirror_notifications_id()")
   -> 0.0003s
== 20240820123402 AddBigIntNotificationsId: migrated (0.0041s) ================

== 20240820123403 CopyNotificationsIdValues: migrating ========================
-- execute("SELECT data_type FROM information_schema.columns WHERE table_name = 'notifications' AND column_name = 'id' LIMIT 1")
   -> 0.0021s
-- execute("SELECT MIN(id), MAX(id) FROM notifications")
   -> 0.0010s
-- execute("UPDATE notifications\nSET new_id = id\nWHERE id >= 1 AND id < 10001 AND new_id != id\n")
   -> 0.0142s
== 20240820123403 CopyNotificationsIdValues: migrated (0.0180s) ===============

== 20240820123404 CopyNotificationsIdIndexes: migrating =======================
-- execute("SELECT data_type FROM information_schema.columns WHERE table_name = 'notifications' AND column_name = 'id' LIMIT 1")
   -> 0.0022s
-- execute("SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'notifications' AND indexdef SIMILAR TO '%\\mid\\M%' AND schemaname = 'public'")
   -> 0.0028s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS notifications_pkey_bigint")
   -> 0.0002s
-- execute("CREATE UNIQUE INDEX CONCURRENTLY notifications_pkey_bigint ON public.notifications USING btree (new_id)")
   -> 0.0039s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_notifications_read_or_not_high_priority_bigint")
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY index_notifications_read_or_not_high_priority_bigint ON public.notifications USING btree (user_id, new_id DESC, read, topic_id) WHERE (read OR (high_priority = false))")
   -> 0.0034s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_notifications_unique_unread_high_priority_bigint")
   -> 0.0002s
-- execute("CREATE UNIQUE INDEX CONCURRENTLY index_notifications_unique_unread_high_priority_bigint ON public.notifications USING btree (user_id, new_id) WHERE ((NOT read) AND (high_priority = true))")
   -> 0.0029s
== 20240820123404 CopyNotificationsIdIndexes: migrated (0.0168s) ==============

== 20240820123405 SwapBigIntNotificationsId: migrating ========================
-- execute("SELECT data_type FROM information_schema.columns WHERE table_name = 'notifications' AND column_name = 'id' LIMIT 1")
   -> 0.0020s
-- execute("DROP TRIGGER notifications_new_id_trigger ON notifications")
   -> 0.0004s
-- execute("DROP FUNCTION mirror_notifications_id()")
   -> 0.0003s
-- execute("ALTER TABLE notifications ALTER COLUMN id DROP DEFAULT")
   -> 0.0003s
-- execute("ALTER TABLE notifications ALTER COLUMN new_id SET DEFAULT nextval('notifications_id_seq'::regclass)")
   -> 0.0004s
-- execute("ALTER SEQUENCE notifications_id_seq OWNED BY notifications.new_id")
   -> 0.0002s
-- execute("ALTER TABLE notifications RENAME COLUMN id TO old_id")
   -> 0.0001s
-- execute("ALTER TABLE notifications RENAME COLUMN new_id TO id")
   -> 0.0001s
-- execute("ALTER TABLE notifications DROP CONSTRAINT notifications_pkey")
   -> 0.0003s
-- execute("ALTER TABLE notifications ADD CONSTRAINT notifications_pkey PRIMARY KEY USING INDEX notifications_pkey_bigint")
   -> 0.0003s
-- execute("ALTER TABLE notifications ALTER COLUMN old_id DROP NOT NULL")
   -> 0.0001s
== 20240820123405 SwapBigIntNotificationsId: migrated (0.0084s) ===============

== 20240820123406 DropOldNotificationIdIndexes: migrating =====================
-- execute("SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'notifications' AND indexdef SIMILAR TO '%\\mold_id\\M%'")
   -> 0.0020s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_notifications_read_or_not_high_priority")
   -> 0.0042s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_notifications_unique_unread_high_priority")
   -> 0.0042s
-- execute("SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'notifications' AND indexdef SIMILAR TO '%\\mid\\M%' AND schemaname = 'public'")
   -> 0.0020s
-- execute("ALTER INDEX index_notifications_read_or_not_high_priority_bigint RENAME TO index_notifications_read_or_not_high_priority")
   -> 0.0003s
-- execute("ALTER INDEX index_notifications_unique_unread_high_priority_bigint RENAME TO index_notifications_unique_unread_high_priority")
   -> 0.0002s
== 20240820123406 DropOldNotificationIdIndexes: migrated (0.0136s) ============

== 20240826121501 AddBigIntShelvedNotificationsNotificationId: migrating ======
-- execute("ALTER TABLE shelved_notifications ADD COLUMN new_notification_id BIGINT NOT NULL DEFAULT 0")
   -> 0.0005s
-- execute("CREATE FUNCTION mirror_user_badges_notification_id() RETURNS trigger AS $$ BEGIN NEW.new_notification_id = NEW.notification_id; RETURN NEW; END; $$ LANGUAGE plpgsql")
   -> 0.0003s
-- execute("CREATE TRIGGER user_badges_new_notification_id_trigger BEFORE INSERT ON shelved_notifications FOR EACH ROW EXECUTE PROCEDURE mirror_user_badges_notification_id()")
   -> 0.0003s
== 20240826121501 AddBigIntShelvedNotificationsNotificationId: migrated (0.0015s) 

== 20240826121502 CopyShelvedNotificationsNotificationIdValues: migrating =====
-- execute("SELECT MIN(id), MAX(id) FROM shelved_notifications")
   -> 0.0005s
== 20240826121502 CopyShelvedNotificationsNotificationIdValues: migrated (0.0009s) 

== 20240826121503 CopyShelvedNotificationsNotificationIdIndexes: migrating ====
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_shelved_notifications_on_new_notification_id")
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY index_shelved_notifications_on_new_notification_id ON shelved_notifications (new_notification_id)")
   -> 0.0031s
== 20240826121503 CopyShelvedNotificationsNotificationIdIndexes: migrated (0.0038s) 

== 20240826121504 SwapBigIntShelvedNotificationsNotificationId: migrating =====
-- execute("DROP TRIGGER user_badges_new_notification_id_trigger ON shelved_notifications")
   -> 0.0003s
-- execute("DROP FUNCTION mirror_user_badges_notification_id()")
   -> 0.0002s
-- execute("ALTER TABLE shelved_notifications ALTER COLUMN new_notification_id DROP DEFAULT")
   -> 0.0002s
-- execute("ALTER TABLE shelved_notifications RENAME COLUMN notification_id TO old_notification_id")
   -> 0.0002s
-- execute("ALTER TABLE shelved_notifications RENAME COLUMN new_notification_id TO notification_id")
   -> 0.0001s
-- execute("ALTER TABLE shelved_notifications ALTER COLUMN old_notification_id DROP NOT NULL")
   -> 0.0001s
-- execute("DROP INDEX IF EXISTS index_shelved_notifications_on_notification_id")
   -> 0.0003s
-- execute("ALTER INDEX index_shelved_notifications_on_new_notification_id RENAME TO index_shelved_notifications_on_notification_id")
   -> 0.0002s
== 20240826121504 SwapBigIntShelvedNotificationsNotificationId: migrated (0.0054s) 

== 20240826121505 AddBigIntUserBadgesNotificationId: migrating ================
-- execute("ALTER TABLE user_badges ADD COLUMN new_notification_id BIGINT")
   -> 0.0004s
-- execute("CREATE FUNCTION mirror_user_badges_notification_id() RETURNS trigger AS $$ BEGIN NEW.new_notification_id = NEW.notification_id; RETURN NEW; END; $$ LANGUAGE plpgsql")
   -> 0.0003s
-- execute("CREATE TRIGGER user_badges_new_notification_id_trigger BEFORE INSERT ON user_badges FOR EACH ROW EXECUTE PROCEDURE mirror_user_badges_notification_id()")
   -> 0.0003s
== 20240826121505 AddBigIntUserBadgesNotificationId: migrated (0.0015s) =======

== 20240826121506 CopyUserBadgesNotificationIdValues: migrating ===============
-- execute("SELECT MIN(id), MAX(id) FROM user_badges")
   -> 0.0008s
-- execute("UPDATE user_badges SET new_notification_id = notification_id WHERE id >= 1 AND id < 10001 AND notification_id IS NOT NULL AND new_notification_id IS NULL")
   -> 0.0037s
== 20240826121506 CopyUserBadgesNotificationIdValues: migrated (0.0051s) ======

== 20240826121507 SwapBigIntUserBadgesNotificationId: migrating ===============
-- execute("DROP TRIGGER user_badges_new_notification_id_trigger ON user_badges")
   -> 0.0003s
-- execute("DROP FUNCTION mirror_user_badges_notification_id()")
   -> 0.0002s
-- execute("ALTER TABLE user_badges RENAME COLUMN notification_id TO old_notification_id")
   -> 0.0002s
-- execute("ALTER TABLE user_badges RENAME COLUMN new_notification_id TO notification_id")
   -> 0.0001s
== 20240826121507 SwapBigIntUserBadgesNotificationId: migrated (0.0047s) ======

== 20240827040131 AddNewNotificationIdToChatMentionNotifications: migrating ===
-- execute("ALTER TABLE chat_mention_notifications ADD COLUMN new_notification_id BIGINT NOT NULL DEFAULT(0)")
   -> 0.0004s
-- execute("CREATE FUNCTION mirror_chat_mention_notifications_notification_id()\nRETURNS trigger AS\n$$\nBEGIN\n  NEW.new_notification_id = NEW.notification_id;\n  RETURN NEW;\nEND;\n$$\nLANGUAGE plpgsql\n")
   -> 0.0002s
-- execute("CREATE TRIGGER chat_mention_notifications_new_notification_id_trigger BEFORE INSERT ON chat_mention_notifications\nFOR EACH ROW EXECUTE PROCEDURE mirror_chat_mention_notifications_notification_id()\n")
   -> 0.0002s
== 20240827040131 AddNewNotificationIdToChatMentionNotifications: migrated (0.0012s) 

== 20240827040550 CopyChatMentionNotificationsNotificationIdValues: migrating =
-- execute("SELECT MIN(notification_id), MAX(notification_id) FROM chat_mention_notifications")
   -> 0.0004s
== 20240827040550 CopyChatMentionNotificationsNotificationIdValues: migrated (0.0008s) 

== 20240827040810 CopyChatMentionNotificationsNotificationIdIndexes: migrating 
-- execute("DROP INDEX CONCURRENTLY  IF EXISTS index_chat_mention_notifications_on_new_notification_id")
   -> 0.0002s
-- execute("CREATE UNIQUE INDEX CONCURRENTLY  index_chat_mention_notifications_on_new_notification_id ON chat_mention_notifications (new_notification_id)")
   -> 0.0031s
== 20240827040810 CopyChatMentionNotificationsNotificationIdIndexes: migrated (0.0037s) 

== 20240827040811 SwapBigintChatMentionNotificationsNotificationId: migrating =
-- execute("DROP TRIGGER chat_mention_notifications_new_notification_id_trigger ON chat_mention_notifications")
   -> 0.0003s
-- execute("DROP FUNCTION mirror_chat_mention_notifications_notification_id()")
   -> 0.0002s
-- execute("ALTER TABLE chat_mention_notifications RENAME COLUMN notification_id TO old_notification_id")
   -> 0.0001s
-- execute("ALTER TABLE chat_mention_notifications RENAME COLUMN new_notification_id TO notification_id")
   -> 0.0001s
-- execute("DROP INDEX index_chat_mention_notifications_on_notification_id")
   -> 0.0002s
-- execute("ALTER INDEX index_chat_mention_notifications_on_new_notification_id RENAME TO index_chat_mention_notifications_on_notification_id")
   -> 0.0001s
-- execute("ALTER TABLE chat_mention_notifications ALTER COLUMN old_notification_id DROP NOT NULL")
   -> 0.0002s
-- execute("ALTER TABLE chat_mention_notifications ALTER COLUMN notification_id DROP DEFAULT")
   -> 0.0002s
== 20240827040811 SwapBigintChatMentionNotificationsNotificationId: migrated (0.0052s) 

== 20240827063715 AddNewSeenNotificationIdToUsers: migrating ==================
-- execute("ALTER TABLE users ADD COLUMN new_seen_notification_id BIGINT NOT NULL DEFAULT(0)")
   -> 0.0006s
-- execute("CREATE FUNCTION mirror_users_seen_notification_id() RETURNS trigger AS $$ BEGIN NEW.new_seen_notification_id = NEW.seen_notification_id; RETURN NEW; END; $$ LANGUAGE plpgsql")
   -> 0.0003s
-- execute("CREATE TRIGGER users_seen_notification_id_trigger BEFORE INSERT OR UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE mirror_users_seen_notification_id()")
   -> 0.0002s
== 20240827063715 AddNewSeenNotificationIdToUsers: migrated (0.0016s) =========

== 20240827063908 CopyUsersSeenNotificationIdValues: migrating ================
-- execute("SELECT MIN(id), MAX(id) FROM users")
   -> 0.0005s
-- execute("UPDATE users SET new_seen_notification_id = seen_notification_id WHERE id >= -2 AND id < 9998 AND new_seen_notification_id != seen_notification_id")
   -> 0.0016s
== 20240827063908 CopyUsersSeenNotificationIdValues: migrated (0.0026s) =======

== 20240827064121 SwapSeenNotificationIdWithSeenNotificationIdOnUsers: migrating 
-- execute("DROP TRIGGER users_seen_notification_id_trigger ON users")
   -> 0.0002s
-- execute("DROP FUNCTION mirror_users_seen_notification_id()")
   -> 0.0001s
-- execute("ALTER TABLE users RENAME COLUMN seen_notification_id TO old_seen_notification_id")
   -> 0.0002s
-- execute("ALTER TABLE users RENAME COLUMN new_seen_notification_id TO seen_notification_id")
   -> 0.0001s
-- execute("ALTER TABLE users ALTER COLUMN old_seen_notification_id DROP NOT NULL")
   -> 0.0002s
-- execute("ALTER TABLE users ALTER COLUMN old_seen_notification_id DROP DEFAULT")
   -> 0.0002s
== 20240827064121 SwapSeenNotificationIdWithSeenNotificationIdOnUsers: migrated (0.0047s) 

== 20240828191047 CreateCategoryModerationGroups: migrating ===================
-- create_table(:category_moderation_groups)
   -> 0.0041s
-- add_index(:category_moderation_groups, [:category_id, :group_id], {:unique=>true})
   -> 0.0026s
-- execute("INSERT INTO category_moderation_groups (category_id, group_id, created_at, updated_at)\nSELECT id, reviewable_by_group_id, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP\nFROM categories\nWHERE reviewable_by_group_id IS NOT NULL\n")
   -> 0.0004s
== 20240828191047 CreateCategoryModerationGroups: migrated (0.0076s) ==========

== 20240829083823 EnsureUniqueTagUserNotificationLevel: migrating =============
-- execute("      DELETE FROM tag_users\n      USING tag_users AS dupe\n      WHERE tag_users.id > dupe.id\n      AND tag_users.user_id = dupe.user_id\n      AND tag_users.tag_id = dupe.tag_id;\n")
   -> 0.0006s
-- add_index(:tag_users, [:user_id, :tag_id], {:unique=>true})
   -> 0.0027s
== 20240829083823 EnsureUniqueTagUserNotificationLevel: migrated (0.0037s) ====

== 20240829140226 DropOldNotificationIdColumns: migrating =====================
== 20240829140226 DropOldNotificationIdColumns: migrated (0.0044s) ============

== 20240829140227 DropChatMentionNotificationsOldIdColumn: migrating ==========
== 20240829140227 DropChatMentionNotificationsOldIdColumn: migrated (0.0014s) =

== 20240903024157 RemoveUserPasswordsIndexes: migrating =======================
-- remove_index(:user_passwords, [:user_id, :password_hash], {:unique=>true})
   -> 0.0023s
-- remove_index(:user_passwords, [:user_id, :password_expired_at, :password_hash], {:name=>"idx_user_passwords_on_user_id_and_expired_at_and_hash"})
   -> 0.0020s
== 20240903024157 RemoveUserPasswordsIndexes: migrated (0.0047s) ==============

== 20240903024211 AddTriggerToUsersToSyncUserPasswords: migrating =============
-- execute("DROP TRIGGER IF EXISTS users_password_sync ON users;")
   -> 0.0003s
-- execute("CREATE OR REPLACE FUNCTION mirror_user_password_data() RETURNS TRIGGER AS $$ BEGIN INSERT INTO user_passwords (user_id, password_hash, password_salt, password_algorithm, password_expired_at, created_at, updated_at) VALUES (NEW.id, NEW.password_hash, NEW.salt, NEW.password_algorithm, NULL, now(), now()) ON CONFLICT(user_id) DO UPDATE SET password_hash = EXCLUDED.password_hash, password_salt = EXCLUDED.password_salt, password_algorithm = EXCLUDED.password_algorithm, password_expired_at = EXCLUDED.password_expired_at, updated_at = now() WHERE user_passwords.password_hash <> EXCLUDED.password_hash; RETURN NEW; END; $$ LANGUAGE plpgsql;")
   -> 0.0004s
-- execute("CREATE TRIGGER users_password_sync AFTER INSERT OR UPDATE OF password_hash ON users FOR EACH ROW WHEN (NEW.password_hash IS NOT NULL) EXECUTE PROCEDURE mirror_user_password_data();")
   -> 0.0003s
-- execute("DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON users;")
   -> 0.0001s
-- execute("CREATE OR REPLACE FUNCTION delete_user_password() RETURNS TRIGGER AS $$ BEGIN DELETE FROM user_passwords WHERE user_id = NEW.id; RETURN NEW; END; $$ LANGUAGE plpgsql;")
   -> 0.0003s
-- execute("CREATE TRIGGER users_password_sync_on_delete_password AFTER UPDATE OF password_hash ON users FOR EACH ROW WHEN (NEW.password_hash IS NULL) EXECUTE PROCEDURE delete_user_password();")
   -> 0.0002s
== 20240903024211 AddTriggerToUsersToSyncUserPasswords: migrated (0.0022s) ====

== 20240903024311 BackfillUserPasswordsFromUsers: migrating ===================
-- execute("INSERT INTO user_passwords (user_id, password_hash, password_salt, password_algorithm, password_expired_at, created_at, updated_at)\nSELECT id, password_hash, salt, password_algorithm, NULL, now(), now()\nFROM users\nWHERE id >= -2 AND id < 49998 AND password_hash IS NOT NULL AND salt IS NOT NULL AND password_algorithm IS NOT NULL\nON CONFLICT (user_id) DO UPDATE SET\n  password_hash = EXCLUDED.password_hash,\n  password_salt = EXCLUDED.password_salt,\n  password_algorithm = EXCLUDED.password_algorithm,\n  password_expired_at = EXCLUDED.password_expired_at,\n  updated_at = now()\nWHERE user_passwords.password_hash <> EXCLUDED.password_hash\n")
   -> 0.0019s
== 20240903024311 BackfillUserPasswordsFromUsers: migrated (0.0031s) ==========

== 20240906142121 MigrateFieldsFromGroupToGroups: migrating ===================
-- execute("      UPDATE discourse_automation_fields\n      SET\n        metadata = '{}'::jsonb\n      WHERE\n        metadata = '{\"value\": [null]}'::jsonb\n        AND component = 'groups'\n        AND name = 'restricted_groups';\n")
   -> 0.0003s
-- execute("      UPDATE discourse_automation_fields\n      SET\n        component = 'groups',\n        name = 'restricted_groups',\n        metadata = CASE\n                    WHEN metadata != '{}'::jsonb THEN jsonb_set(metadata, '{value}', to_jsonb(ARRAY[(metadata->>'value')::int]))\n                    ELSE metadata\n                  END\n      FROM discourse_automation_automations\n      WHERE discourse_automation_fields.automation_id = discourse_automation_automations.id\n        AND discourse_automation_automations.trigger = 'post_created_edited'\n        AND discourse_automation_fields.name = 'restricted_group'\n        AND discourse_automation_fields.component = 'group';\n")
   -> 0.0004s
== 20240906142121 MigrateFieldsFromGroupToGroups: migrated (0.0012s) ==========

== 20240906233304 RemoveLimitsFromFormTemplates: migrating ====================
-- change_column(:form_templates, :name, :string, {:limit=>nil})
   -> 0.0008s
-- change_column(:form_templates, :template, :text, {:limit=>nil})
   -> 0.0003s
== 20240906233304 RemoveLimitsFromFormTemplates: migrated (0.0015s) ===========

== 20240909121255 RebakeUserOnebox: migrating =================================
-- execute("UPDATE posts SET baked_version = 0\nWHERE cooked LIKE '%d-icon-map-marker-alt%'\n")
   -> 0.0019s
== 20240909121255 RebakeUserOnebox: migrated (0.0023s) ========================

== 20240910090759 MakePasswordColumnsFromUsersReadOnly: migrating =============
-- execute("DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON users;\n")
   -> 0.0002s
-- execute("DROP FUNCTION IF EXISTS delete_user_password;\n")
   -> 0.0002s
-- execute("DROP TRIGGER IF EXISTS users_password_sync ON users;\n")
   -> 0.0002s
-- execute("DROP FUNCTION IF EXISTS mirror_user_password_data;\n")
   -> 0.0001s
== 20240910090759 MakePasswordColumnsFromUsersReadOnly: migrated (0.0108s) ====

== 20240912061702 DropUserSearchSimilarResultsSiteSetting: migrating ==========
-- execute("DELETE FROM site_settings WHERE name = 'user_search_similar_results';\n")
   -> 0.0002s
== 20240912061702 DropUserSearchSimilarResultsSiteSetting: migrated (0.0006s) =

== 20240912061806 DropTrgmIndexesOnUsers: migrating ===========================
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_users_on_username_lower_trgm;\n")
   -> 0.0044s
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_users_on_name_trgm;\n")
   -> 0.0041s
== 20240912061806 DropTrgmIndexesOnUsers: migrated (0.0092s) ==================

== 20240912210450 DeleteAnonymousUsersFromDirectoryItems: migrating ===========
== 20240912210450 DeleteAnonymousUsersFromDirectoryItems: migrated (0.0014s) ==

== 20240912212253 IncreaseExternalAvatarUrlLimitTo2000: migrating =============
-- change_column(:single_sign_on_records, :external_avatar_url, :string, {:limit=>2000})
   -> 0.0004s
== 20240912212253 IncreaseExternalAvatarUrlLimitTo2000: migrated (0.0008s) ====

== 20241003122030 AddNotificationLevelToUserChatChannelMemberships: migrating =
-- execute("DROP INDEX CONCURRENTLY IF EXISTS user_chat_channel_memberships_index\n")
   -> 0.0043s
-- add_column(:user_chat_channel_memberships, :notification_level, :integer, {:null=>true})
   -> 0.0005s
-- execute("SELECT MIN(id), MAX(id) FROM user_chat_channel_memberships")
   -> 0.0005s
-- change_column_default(:user_chat_channel_memberships, :notification_level, 1)
   -> 0.0018s
-- change_column_null(:user_chat_channel_memberships, :notification_level, false)
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY user_chat_channel_memberships_index ON user_chat_channel_memberships using btree (user_id, chat_channel_id, notification_level, following)\n")
   -> 0.0036s
== 20241003122030 AddNotificationLevelToUserChatChannelMemberships: migrated (0.0116s) 

== 20241010155139 AlterAutomationIdsToBigint: migrating =======================
-- change_column(:discourse_automation_fields, :automation_id, :bigint)
   -> 0.0061s
-- change_column(:discourse_automation_pending_automations, :automation_id, :bigint)
   -> 0.0033s
-- change_column(:discourse_automation_pending_pms, :automation_id, :bigint)
   -> 0.0062s
== 20241010155139 AlterAutomationIdsToBigint: migrated (0.0162s) ==============

== 20241011033602 AddPostBadgesToThemeModifiers: migrating ====================
-- add_column(:theme_modifier_sets, :serialize_post_user_badges, :string, {:array=>true})
   -> 0.0005s
-- add_column(:theme_modifier_sets, :theme_setting_modifiers, :jsonb)
   -> 0.0003s
== 20241011033602 AddPostBadgesToThemeModifiers: migrated (0.0013s) ===========

== 20241011054348 FixUniqueConstraintOnProblemCheckTrackers: migrating ========
-- remove_index(:problem_check_trackers, [:identifier, :target], {:if_exists=>true})
   -> 0.0031s
-- execute("DELETE FROM problem_check_trackers\nWHERE id IN(\n  SELECT pct1.id\n  FROM problem_check_trackers pct1\n  JOIN problem_check_trackers pct2\n  ON pct1.identifier = pct2.identifier\n  AND pct1.target IS NULL\n  AND pct2.target IS NULL\n  WHERE pct1.id > pct2.id\n)\n")
   -> 0.0005s
-- add_index(:problem_check_trackers, [:identifier, :target], {:unique=>true, :nulls_not_distinct=>true})
   -> 0.0165s
== 20241011054348 FixUniqueConstraintOnProblemCheckTrackers: migrated (0.0208s) 

== 20241011080517 DropPasswordColumnsFromUsers: migrating =====================
== 20241011080517 DropPasswordColumnsFromUsers: migrated (0.0036s) ============

== 20241016174732 RemoveNameRequirementFromAutomations: migrating =============
-- change_column_null(:discourse_automation_automations, :name, true)
   -> 0.0003s
== 20241016174732 RemoveNameRequirementFromAutomations: migrated (0.0007s) ====

== 20241018031851 AddDefaultValueToProblemCheckTrackersTarget: migrating ======
-- change_column_default(:problem_check_trackers, :target, "__NULL__")
   -> 0.0016s
-- execute("UPDATE problem_check_trackers\nSET target='__NULL__'\nWHERE target IS NULL\n")
   -> 0.0003s
== 20241018031851 AddDefaultValueToProblemCheckTrackersTarget: migrated (0.0024s) 

== 20241022022326 RemoveNullsNotDistinctFromProblemCheckTrackers: migrating ===
-- remove_index(:problem_check_trackers, [:identifier, :target], {:if_exists=>true})
   -> 0.0026s
-- add_index(:problem_check_trackers, [:identifier, :target], {:unique=>true})
   -> 0.0031s
== 20241022022326 RemoveNullsNotDistinctFromProblemCheckTrackers: migrated (0.0062s) 

== 20241023041126 ClearDuplicateAdminNotices: migrating =======================
== 20241023041126 ClearDuplicateAdminNotices: migrated (0.0010s) ==============

== 20241024093027 RemoveCategoryExpertsWebHookEventTypes: migrating ===========
-- execute("DELETE FROM web_hook_event_types WHERE (name, id) IN (('category_experts_approved', 1901), ('category_experts_unapproved', 1902))")
   -> 0.0002s
== 20241024093027 RemoveCategoryExpertsWebHookEventTypes: migrated (0.0006s) ==

== 20241024102733 RemoveExperimentalRedesignedAboutPageGroupsSetting: migrating 
-- execute("DELETE FROM site_settings\nWHERE name = 'experimental_redesigned_about_page_groups'\n")
   -> 0.0002s
== 20241024102733 RemoveExperimentalRedesignedAboutPageGroupsSetting: migrated (0.0006s) 

== 20241025045928 AddInvitesLinkToSidebar: migrating ==========================
== 20241025045928 AddInvitesLinkToSidebar: migrated (0.0027s) =================

== 20241028021339 AddSmartListUserPreference: migrating =======================
-- add_column(:user_options, :enable_smart_lists, :boolean, {:default=>true, :null=>false})
   -> 0.0008s
== 20241028021339 AddSmartListUserPreference: migrated (0.0012s) ==============

== 20241029192512 AlterChatIdsToBigint: migrating =============================
-- change_column(:chat_channel_archives, :chat_channel_id, :bigint)
   -> 0.0084s
-- change_column(:chat_channels, :chatable_id, :bigint)
   -> 0.0179s
-- change_column(:chat_drafts, :chat_channel_id, :bigint)
   -> 0.0054s
-- change_column(:chat_mention_notifications, :chat_mention_id, :bigint)
   -> 0.0049s
-- change_column(:chat_mention_notifications, :notification_id, :bigint)
   -> 0.0007s
-- change_column(:chat_mentions, :chat_message_id, :bigint)
   -> 0.0089s
-- change_column(:chat_message_reactions, :chat_message_id, :bigint)
   -> 0.0078s
-- change_column(:chat_message_revisions, :chat_message_id, :bigint)
   -> 0.0097s
-- change_column(:chat_messages, :chat_channel_id, :bigint)
   -> 0.0153s
-- change_column(:chat_messages, :in_reply_to_id, :bigint)
   -> 0.0150s
-- change_column(:chat_webhook_events, :chat_message_id, :bigint)
   -> 0.0053s
-- change_column(:chat_webhook_events, :incoming_chat_webhook_id, :bigint)
   -> 0.0053s
-- change_column(:direct_message_users, :direct_message_channel_id, :bigint)
   -> 0.0052s
-- change_column(:incoming_chat_webhooks, :chat_channel_id, :bigint)
   -> 0.0078s
-- change_column(:user_chat_channel_memberships, :chat_channel_id, :bigint)
   -> 0.0102s
-- change_column(:user_chat_channel_memberships, :last_read_message_id, :bigint)
   -> 0.0080s
-- change_column(:user_chat_channel_memberships, :last_unread_mention_when_emailed_id, :bigint)
   -> 0.0084s
== 20241029192512 AlterChatIdsToBigint: migrated (0.1455s) ====================

== 20241030210727 SplitHideProfileAndPresence: migrating ======================
-- execute("SELECT value, data_type FROM site_settings WHERE name = 'default_hide_profile_and_presence' LIMIT 1")
   -> 0.0003s
-- execute("ALTER TABLE user_options ADD COLUMN hide_profile BOOLEAN DEFAULT FALSE NOT NULL")
   -> 0.0006s
-- execute("ALTER TABLE user_options ADD COLUMN hide_presence BOOLEAN DEFAULT FALSE NOT NULL")
   -> 0.0004s
-- execute("      UPDATE user_options\n      SET hide_profile = hide_profile_and_presence,\n          hide_presence = hide_profile_and_presence\n      WHERE hide_profile_and_presence;\n")
   -> 0.0003s
== 20241030210727 SplitHideProfileAndPresence: migrated (0.0021s) =============

== 20241031050638 AddCustomFieldsToChat: migrating ============================
-- create_table(:chat_thread_custom_fields)
   -> 0.0066s
-- create_table(:chat_message_custom_fields)
   -> 0.0060s
-- create_table(:chat_channel_custom_fields)
   -> 0.0061s
-- add_index(:chat_thread_custom_fields, [:thread_id, :name], {:unique=>true})
   -> 0.0028s
-- add_index(:chat_message_custom_fields, [:message_id, :name], {:unique=>true})
   -> 0.0027s
-- add_index(:chat_channel_custom_fields, [:channel_id, :name], {:unique=>true})
   -> 0.0029s
== 20241031050638 AddCustomFieldsToChat: migrated (0.0281s) ===================

== 20241101141701 AlterBookmarksIdsToBigint: migrating ========================
-- change_column(:bookmarks, :bookmarkable_id, :bigint)
   -> 0.0151s
== 20241101141701 AlterBookmarksIdsToBigint: migrated (0.0157s) ===============

== 20241104053309 AddIconUploadIdToChatChannel: migrating =====================
-- add_column(:chat_channels, :icon_upload_id, :integer)
   -> 0.0005s
== 20241104053309 AddIconUploadIdToChatChannel: migrated (0.0010s) ============

== 20241104132424 RenameFullPageSiteSetting: migrating ========================
-- execute("UPDATE site_settings SET name = 'full_page_login' where name = 'experimental_full_page_login'")
   -> 0.0002s
== 20241104132424 RenameFullPageSiteSetting: migrated (0.0006s) ===============

== 20241105211601 DeleteZeroRankUserVoteCollectionsFromPollVotes: migrating ===
-- execute("DELETE FROM poll_votes\nWHERE (poll_id, user_id) IN (\n    SELECT poll_votes.poll_id, poll_votes.user_id\n    FROM poll_votes\n    JOIN polls ON polls.id = poll_votes.poll_id\n    WHERE polls.type = 3\n    GROUP BY poll_votes.poll_id, poll_votes.user_id\n    HAVING SUM(poll_votes.rank) = 0\n);\n")
   -> 0.0006s
== 20241105211601 DeleteZeroRankUserVoteCollectionsFromPollVotes: migrated (0.0010s) 

== 20241108154026 CreateMovedPosts: migrating =================================
-- create_table(:moved_posts)
   -> 0.0174s
== 20241108154026 CreateMovedPosts: migrated (0.0179s) ========================

== 20241110120303 AddBlocksToChatMessages: migrating ==========================
-- add_column(:chat_messages, :blocks, :jsonb, {:null=>true, :default=>nil})
   -> 0.0007s
== 20241110120303 AddBlocksToChatMessages: migrated (0.0011s) =================

== 20241111022618 CreateChatMessageInteractions: migrating ====================
-- create_table(:chat_message_interactions, {:id=>:bigint})
   -> 0.0059s
-- add_index(:chat_message_interactions, :user_id)
   -> 0.0022s
-- add_index(:chat_message_interactions, :chat_message_id)
   -> 0.0023s
== 20241111022618 CreateChatMessageInteractions: migrated (0.0110s) ===========

== 20241112124552 CreateUserApiKeyClientScopes: migrating =====================
-- create_table(:user_api_key_client_scopes)
   -> 0.0035s
== 20241112124552 CreateUserApiKeyClientScopes: migrated (0.0041s) ============

== 20241112145744 AnonymizeNormalizedEmailColumn: migrating ===================
-- execute("UPDATE user_emails\nSET normalized_email = email\nWHERE SPLIT_PART(email, '@', 2) = 'anonymized.invalid'\n")
   -> 0.0004s
== 20241112145744 AnonymizeNormalizedEmailColumn: migrated (0.0007s) ==========

== 20241120182858 AddIndexToChatMessagesOnChatChannelId: migrating ============
-- execute("DROP INDEX CONCURRENTLY IF EXISTS index_chat_messages_on_chat_channel_id_and_id\n")
   -> 0.0002s
-- execute("CREATE INDEX CONCURRENTLY index_chat_messages_on_chat_channel_id_and_id\nON chat_messages (chat_channel_id,id)\nWHERE deleted_at IS NOT NULL\n")
   -> 0.0029s
== 20241120182858 AddIndexToChatMessagesOnChatChannelId: migrated (0.0036s) ===

== 20241121000131 AddPostHeaderToBadge: migrating =============================
-- add_column(:badges, :show_in_post_header, :boolean, {:default=>false, :null=>false})
   -> 0.0008s
== 20241121000131 AddPostHeaderToBadge: migrated (0.0012s) ====================

== 20241127034553 AddPotentiallyIllegalToReviewables: migrating ===============
-- add_column(:reviewables, :potentially_illegal, :boolean)
   -> 0.0003s
-- change_column_default(:reviewables, :potentially_illegal, false)
   -> 0.0020s
== 20241127034553 AddPotentiallyIllegalToReviewables: migrated (0.0029s) ======

== 20241127072350 RemapFa5IconNamesToFa6: migrating ===========================
== 20241127072350 RemapFa5IconNamesToFa6: migrated (0.0004s) ==================

== 20241204085540 RemapToFa6IconNames: migrating ==============================
-- execute("SELECT value FROM site_settings WHERE name = 'svg_icon_subset'")
   -> 0.0002s
-- execute("WITH remaps AS (\n  SELECT from_icon, to_icon FROM (VALUES ('adjust', 'circle-half-stroke'), ('air-freshener', 'spray-can-sparkles'), ('alien-monster', 'alien-8bit'), ('allergies', 'hand-dots'), ('ambulance', 'truck-medical'), ('american-sign-language-interpreting', 'hands-asl-interpreting'), ('analytics', 'chart-mixed'), ('angle-double-down', 'angles-down'), ('angle-double-left', 'angles-left'), ('angle-double-right', 'angles-right'), ('angle-double-up', 'angles-up'), ('angry', 'face-angry'), ('apple-alt', 'apple-whole'), ('apple-crate', 'crate-apple'), ('archive', 'box-archive'), ('arrow-alt-circle-down', 'circle-down'), ('arrow-alt-circle-left', 'circle-left'), ('arrow-alt-circle-right', 'circle-right'), ('arrow-alt-circle-up', 'circle-up'), ('arrow-alt-down', 'down'), ('arrow-alt-from-bottom', 'up-from-line'), ('arrow-alt-from-left', 'right-from-line'), ('arrow-alt-from-right', 'left-from-line'), ('arrow-alt-from-top', 'down-from-line'), ('arrow-alt-left', 'left'), ('arrow-alt-right', 'right'), ('arrow-alt-square-down', 'square-down'), ('arrow-alt-square-left', 'square-left'), ('arrow-alt-square-right', 'square-right'), ('arrow-alt-square-up', 'square-up'), ('arrow-alt-to-bottom', 'down-to-line'), ('arrow-alt-to-left', 'left-to-line'), ('arrow-alt-to-right', 'right-to-line'), ('arrow-alt-to-top', 'up-to-line'), ('arrow-alt-up', 'up'), ('arrow-circle-down', 'circle-arrow-down'), ('arrow-circle-left', 'circle-arrow-left'), ('arrow-circle-right', 'circle-arrow-right'), ('arrow-circle-up', 'circle-arrow-up'), ('arrow-from-bottom', 'arrow-up-from-line'), ('arrow-from-left', 'arrow-right-from-line'), ('arrow-from-right', 'arrow-left-from-line'), ('arrow-from-top', 'arrow-down-from-line'), ('arrow-square-down', 'square-arrow-down'), ('arrow-square-left', 'square-arrow-left'), ('arrow-square-right', 'square-arrow-right'), ('arrow-square-up', 'square-arrow-up'), ('arrow-to-bottom', 'arrow-down-to-line'), ('arrow-to-left', 'arrow-left-to-line'), ('arrow-to-right', 'arrow-right-to-line'), ('arrow-to-top', 'arrow-up-to-line'), ('arrows', 'arrows-up-down-left-right'), ('arrows-alt', 'up-down-left-right'), ('arrows-alt-h', 'left-right'), ('arrows-alt-v', 'up-down'), ('arrows-h', 'arrows-left-right'), ('arrows-v', 'arrows-up-down'), ('assistive-listening-systems', 'ear-listen'), ('atlas', 'book-atlas'), ('atom-alt', 'atom-simple'), ('backspace', 'delete-left'), ('balance-scale', 'scale-balanced'), ('balance-scale-left', 'scale-unbalanced'), ('balance-scale-right', 'scale-unbalanced-flip'), ('band-aid', 'bandage'), ('barcode-alt', 'rectangle-barcode'), ('baseball-ball', 'baseball'), ('basketball-ball', 'basketball'), ('bed-alt', 'bed-front'), ('beer', 'beer-mug-empty'), ('betamax', 'cassette-betamax'), ('bible', 'book-bible'), ('biking', 'person-biking'), ('biking-mountain', 'person-biking-mountain'), ('birthday-cake', 'cake-candles'), ('blind', 'person-walking-with-cane'), ('book-alt', 'book-blank'), ('book-dead', 'book-skull'), ('book-reader', 'book-open-reader'), ('book-spells', 'book-sparkles'), ('border-style', 'border-top-left'), ('border-style-alt', 'border-bottom-right'), ('box-alt', 'box-taped'), ('box-fragile', 'square-fragile'), ('box-full', 'box-open-full'), ('box-up', 'square-this-way-up'), ('box-usd', 'box-dollar'), ('boxes', 'boxes-stacked'), ('boxes-alt', 'boxes-stacked'), ('brackets', 'brackets-square'), ('broadcast-tower', 'tower-broadcast'), ('burn', 'fire-flame-simple'), ('bus-alt', 'bus-simple'), ('calculator-alt', 'calculator-simple'), ('calendar-alt', 'calendar-days'), ('calendar-edit', 'calendar-pen'), ('calendar-times', 'calendar-xmark'), ('camera-alt', 'camera'), ('camera-home', 'camera-security'), ('car-alt', 'car-rear'), ('car-crash', 'car-burst'), ('car-mechanic', 'car-wrench'), ('caravan-alt', 'caravan-simple'), ('caret-circle-down', 'circle-caret-down'), ('caret-circle-left', 'circle-caret-left'), ('caret-circle-right', 'circle-caret-right'), ('caret-circle-up', 'circle-caret-up'), ('caret-square-down', 'square-caret-down'), ('caret-square-left', 'square-caret-left'), ('caret-square-right', 'square-caret-right'), ('caret-square-up', 'square-caret-up'), ('cctv', 'camera-cctv'), ('chalkboard-teacher', 'chalkboard-user'), ('chart-pie-alt', 'chart-pie-simple'), ('check-circle', 'circle-check'), ('check-square', 'square-check'), ('cheeseburger', 'burger-cheese'), ('chess-bishop-alt', 'chess-bishop-piece'), ('chess-clock-alt', 'chess-clock-flip'), ('chess-king-alt', 'chess-king-piece'), ('chess-knight-alt', 'chess-knight-piece'), ('chess-pawn-alt', 'chess-pawn-piece'), ('chess-queen-alt', 'chess-queen-piece'), ('chess-rook-alt', 'chess-rook-piece'), ('chevron-circle-down', 'circle-chevron-down'), ('chevron-circle-left', 'circle-chevron-left'), ('chevron-circle-right', 'circle-chevron-right'), ('chevron-circle-up', 'circle-chevron-up'), ('chevron-double-down', 'chevrons-down'), ('chevron-double-left', 'chevrons-left'), ('chevron-double-right', 'chevrons-right'), ('chevron-double-up', 'chevrons-up'), ('chevron-square-down', 'square-chevron-down'), ('chevron-square-left', 'square-chevron-left'), ('chevron-square-right', 'square-chevron-right'), ('chevron-square-up', 'square-chevron-up'), ('clinic-medical', 'house-chimney-medical'), ('cloud-download', 'cloud-arrow-down'), ('cloud-download-alt', 'cloud-arrow-down'), ('cloud-upload', 'cloud-arrow-up'), ('cloud-upload-alt', 'cloud-arrow-up'), ('cocktail', 'martini-glass-citrus'), ('coffee', 'mug-saucer'), ('coffee-togo', 'cup-togo'), ('cog', 'gear'), ('cogs', 'gears'), ('columns', 'table-columns'), ('comment-alt', 'message'), ('comment-alt-check', 'message-check'), ('comment-alt-dollar', 'message-dollar'), ('comment-alt-dots', 'message-dots'), ('comment-alt-edit', 'message-pen'), ('comment-alt-exclamation', 'message-exclamation'), ('comment-alt-lines', 'message-lines'), ('comment-alt-medical', 'message-medical'), ('comment-alt-minus', 'message-minus'), ('comment-alt-music', 'message-music'), ('comment-alt-plus', 'message-plus'), ('comment-alt-slash', 'message-slash'), ('comment-alt-smile', 'message-smile'), ('comment-alt-times', 'message-xmark'), ('comment-edit', 'comment-pen'), ('comment-times', 'comment-xmark'), ('comments-alt', 'messages'), ('comments-alt-dollar', 'messages-dollar'), ('compress-alt', 'down-left-and-up-right-to-center'), ('compress-arrows-alt', 'minimize'), ('concierge-bell', 'bell-concierge'), ('construction', 'triangle-person-digging'), ('conveyor-belt-alt', 'conveyor-belt-boxes'), ('cowbell-more', 'cowbell-circle-plus'), ('cricket', 'cricket-bat-ball'), ('crop-alt', 'crop-simple'), ('curling', 'curling-stone'), ('cut', 'scissors'), ('deaf', 'ear-deaf'), ('debug', 'ban-bug'), ('desktop-alt', 'desktop'), ('dewpoint', 'droplet-degree'), ('diagnoses', 'person-dots-from-line'), ('digging', 'person-digging'), ('digital-tachograph', 'tachograph-digital'), ('directions', 'diamond-turn-right'), ('dizzy', 'face-dizzy'), ('dolly-flatbed', 'cart-flatbed'), ('dolly-flatbed-alt', 'cart-flatbed-boxes'), ('dolly-flatbed-empty', 'cart-flatbed-empty'), ('donate', 'circle-dollar-to-slot'), ('dot-circle', 'circle-dot'), ('drafting-compass', 'compass-drafting'), ('drone-alt', 'drone-front'), ('dryer-alt', 'dryer-heat'), ('eclipse-alt', 'moon-over-sun'), ('edit', 'pen-to-square'), ('ellipsis-h', 'ellipsis'), ('ellipsis-h-alt', 'ellipsis-stroke'), ('ellipsis-v', 'ellipsis-vertical'), ('ellipsis-v-alt', 'ellipsis-stroke-vertical'), ('envelope-square', 'square-envelope'), ('exchange', 'arrow-right-arrow-left'), ('exchange-alt', 'right-left'), ('exclamation-circle', 'circle-exclamation'), ('exclamation-square', 'square-exclamation'), ('exclamation-triangle', 'triangle-exclamation'), ('expand-alt', 'up-right-and-down-left-from-center'), ('expand-arrows', 'arrows-maximize'), ('expand-arrows-alt', 'maximize'), ('external-link', 'arrow-up-right-from-square'), ('external-link-alt', 'up-right-from-square'), ('external-link-square', 'square-arrow-up-right'), ('external-link-square-alt', 'square-up-right'), ('eyedropper', 'eye-dropper'), ('fast-backward', 'backward-fast'), ('fast-forward', 'forward-fast'), ('feather-alt', 'feather-pointed'), ('female', 'person-dress'), ('field-hockey', 'field-hockey-stick-ball'), ('fighter-jet', 'jet-fighter'), ('file-alt', 'file-lines'), ('file-archive', 'file-zipper'), ('file-chart-line', 'file-chart-column'), ('file-download', 'file-arrow-down'), ('file-edit', 'file-pen'), ('file-medical-alt', 'file-waveform'), ('file-search', 'file-magnifying-glass'), ('file-times', 'file-xmark'), ('file-upload', 'file-arrow-up'), ('film-alt', 'film-simple'), ('fire-alt', 'fire-flame-curved'), ('first-aid', 'kit-medical'), ('fist-raised', 'hand-fist'), ('flag-alt', 'flag-swallowtail'), ('flame', 'fire-flame'), ('flask-poison', 'flask-round-poison'), ('flask-potion', 'flask-round-potion'), ('flushed', 'face-flushed'), ('fog', 'cloud-fog'), ('folder-download', 'folder-arrow-down'), ('folder-times', 'folder-xmark'), ('folder-upload', 'folder-arrow-up'), ('font-awesome-alt', 'square-font-awesome-stroke'), ('font-awesome-flag', 'font-awesome'), ('font-awesome-logo-full', 'font-awesome'), ('football-ball', 'football'), ('fragile', 'wine-glass-crack'), ('frosty-head', 'snowman-head'), ('frown', 'face-frown'), ('frown-open', 'face-frown-open'), ('funnel-dollar', 'filter-circle-dollar'), ('game-board-alt', 'game-board-simple'), ('gamepad-alt', 'gamepad-modern'), ('glass-champagne', 'champagne-glass'), ('glass-cheers', 'champagne-glasses'), ('glass-martini', 'martini-glass-empty'), ('glass-martini-alt', 'martini-glass'), ('glass-whiskey', 'whiskey-glass'), ('glass-whiskey-rocks', 'whiskey-glass-ice'), ('glasses-alt', 'glasses-round'), ('globe-africa', 'earth-africa'), ('globe-americas', 'earth-americas'), ('globe-asia', 'earth-asia'), ('globe-europe', 'earth-europe'), ('golf-ball', 'golf-ball-tee'), ('grimace', 'face-grimace'), ('grin', 'face-grin'), ('grin-alt', 'face-grin-wide'), ('grin-beam', 'face-grin-beam'), ('grin-beam-sweat', 'face-grin-beam-sweat'), ('grin-hearts', 'face-grin-hearts'), ('grin-squint', 'face-grin-squint'), ('grin-squint-tears', 'face-grin-squint-tears'), ('grin-stars', 'face-grin-stars'), ('grin-tears', 'face-grin-tears'), ('grin-tongue', 'face-grin-tongue'), ('grin-tongue-squint', 'face-grin-tongue-squint'), ('grin-tongue-wink', 'face-grin-tongue-wink'), ('grin-wink', 'face-grin-wink'), ('grip-horizontal', 'grip'), ('h-square', 'square-h'), ('hamburger', 'burger'), ('hand-holding-usd', 'hand-holding-dollar'), ('hand-holding-water', 'hand-holding-droplet'), ('hand-paper', 'hand'), ('hand-receiving', 'hands-holding-diamond'), ('hand-rock', 'hand-back-fist'), ('hands-heart', 'hands-holding-heart'), ('hands-helping', 'handshake-angle'), ('hands-usd', 'hands-holding-dollar'), ('hands-wash', 'hands-bubbles'), ('handshake-alt', 'handshake-simple'), ('handshake-alt-slash', 'handshake-simple-slash'), ('hard-hat', 'helmet-safety'), ('hdd', 'hard-drive'), ('head-vr', 'head-side-goggles'), ('headphones-alt', 'headphones-simple'), ('heart-broken', 'heart-crack'), ('heart-circle', 'circle-heart'), ('heart-rate', 'wave-pulse'), ('heart-square', 'square-heart'), ('heartbeat', 'heart-pulse'), ('hiking', 'person-hiking'), ('history', 'clock-rotate-left'), ('home', 'house'), ('home-alt', 'house'), ('home-heart', 'house-heart'), ('home-lg', 'house-chimney'), ('home-lg-alt', 'house'), ('hospital-alt', 'hospital'), ('hospital-symbol', 'circle-h'), ('hot-tub', 'hot-tub-person'), ('hourglass-half', 'hourglass'), ('house-damage', 'house-chimney-crack'), ('house-leave', 'house-person-leave'), ('house-return', 'house-person-return'), ('hryvnia', 'hryvnia-sign'), ('humidity', 'droplet-percent'), ('icons-alt', 'symbols'), ('id-card-alt', 'id-card-clip'), ('industry-alt', 'industry-windows'), ('info-circle', 'circle-info'), ('info-square', 'square-info'), ('innosoft', '42-group'), ('inventory', 'shelves'), ('journal-whills', 'book-journal-whills'), ('kiss', 'face-kiss'), ('kiss-beam', 'face-kiss-beam'), ('kiss-wink-heart', 'face-kiss-wink-heart'), ('landmark-alt', 'landmark-dome'), ('laptop-house', 'house-laptop'), ('laugh', 'face-laugh'), ('laugh-beam', 'face-laugh-beam'), ('laugh-squint', 'face-laugh-squint'), ('laugh-wink', 'face-laugh-wink'), ('level-down', 'arrow-turn-down'), ('level-down-alt', 'turn-down'), ('level-up', 'arrow-turn-up'), ('level-up-alt', 'turn-up'), ('list-alt', 'rectangle-list'), ('location', 'location-crosshairs'), ('location-circle', 'circle-location-arrow'), ('location-slash', 'location-crosshairs-slash'), ('lock-alt', 'lock-keyhole'), ('lock-open-alt', 'lock-keyhole-open'), ('long-arrow-alt-down', 'down-long'), ('long-arrow-alt-left', 'left-long'), ('long-arrow-alt-right', 'right-long'), ('long-arrow-alt-up', 'up-long'), ('long-arrow-down', 'arrow-down-long'), ('long-arrow-left', 'arrow-left-long'), ('long-arrow-right', 'arrow-right-long'), ('long-arrow-up', 'arrow-up-long'), ('low-vision', 'eye-low-vision'), ('luchador', 'luchador-mask'), ('luggage-cart', 'cart-flatbed-suitcase'), ('magic', 'wand-magic'), ('mail-bulk', 'envelopes-bulk'), ('male', 'person'), ('map-marked', 'map-location'), ('map-marked-alt', 'map-location-dot'), ('map-marker', 'location-pin'), ('map-marker-alt', 'location-dot'), ('map-marker-alt-slash', 'location-dot-slash'), ('map-marker-check', 'location-check'), ('map-marker-edit', 'location-pen'), ('map-marker-exclamation', 'location-exclamation'), ('map-marker-minus', 'location-minus'), ('map-marker-plus', 'location-plus'), ('map-marker-question', 'location-question'), ('map-marker-slash', 'location-pin-slash'), ('map-marker-smile', 'location-smile'), ('map-marker-times', 'location-xmark'), ('map-signs', 'signs-post'), ('mars-stroke-h', 'mars-stroke-right'), ('mars-stroke-v', 'mars-stroke-up'), ('medium-m', 'medium'), ('medkit', 'suitcase-medical'), ('meh', 'face-meh'), ('meh-blank', 'face-meh-blank'), ('meh-rolling-eyes', 'face-rolling-eyes'), ('microphone-alt', 'microphone-lines'), ('microphone-alt-slash', 'microphone-lines-slash'), ('mind-share', 'brain-arrow-curved-right'), ('minus-circle', 'circle-minus'), ('minus-hexagon', 'hexagon-minus'), ('minus-octagon', 'octagon-minus'), ('minus-square', 'square-minus'), ('mobile-alt', 'mobile-screen-button'), ('mobile-android', 'mobile'), ('mobile-android-alt', 'mobile-screen'), ('money-bill-alt', 'money-bill-1'), ('money-bill-wave-alt', 'money-bill-1-wave'), ('money-check-alt', 'money-check-dollar'), ('money-check-edit', 'money-check-pen'), ('money-check-edit-alt', 'money-check-dollar-pen'), ('monitor-heart-rate', 'monitor-waveform'), ('mouse', 'computer-mouse'), ('mouse-alt', 'computer-mouse-scrollwheel'), ('mouse-pointer', 'arrow-pointer'), ('music-alt', 'music-note'), ('music-alt-slash', 'music-note-slash'), ('oil-temp', 'oil-temperature'), ('page-break', 'file-dashed-line'), ('paint-brush', 'paintbrush'), ('paint-brush-alt', 'paintbrush-fine'), ('paint-brush-fine', 'paintbrush-fine'), ('pallet-alt', 'pallet-boxes'), ('paragraph-rtl', 'paragraph-left'), ('parking', 'square-parking'), ('parking-circle', 'circle-parking'), ('parking-circle-slash', 'ban-parking'), ('parking-slash', 'square-parking-slash'), ('pastafarianism', 'spaghetti-monster-flying'), ('pause-circle', 'circle-pause'), ('paw-alt', 'paw-simple'), ('pen-alt', 'pen-clip'), ('pen-square', 'square-pen'), ('pencil-alt', 'pencil'), ('pencil-paintbrush', 'pen-paintbrush'), ('pencil-ruler', 'pen-ruler'), ('pennant', 'flag-pennant'), ('people-arrows', 'people-arrows-left-right'), ('people-carry', 'people-carry-box'), ('percentage', 'percent'), ('person-carry', 'person-carry-box'), ('phone-alt', 'phone-flip'), ('phone-laptop', 'laptop-mobile'), ('phone-square', 'square-phone'), ('phone-square-alt', 'square-phone-flip'), ('photo-video', 'photo-film'), ('plane-alt', 'plane-engines'), ('play-circle', 'circle-play'), ('plus-circle', 'circle-plus'), ('plus-hexagon', 'hexagon-plus'), ('plus-octagon', 'octagon-plus'), ('plus-square', 'square-plus'), ('poll', 'square-poll-vertical'), ('poll-h', 'square-poll-horizontal'), ('portal-enter', 'person-to-portal'), ('portal-exit', 'person-from-portal'), ('portrait', 'image-portrait'), ('pound-sign', 'sterling-sign'), ('pray', 'person-praying'), ('praying-hands', 'hands-praying'), ('prescription-bottle-alt', 'prescription-bottle-medical'), ('presentation', 'presentation-screen'), ('print-search', 'print-magnifying-glass'), ('procedures', 'bed-pulse'), ('project-diagram', 'diagram-project'), ('question-circle', 'circle-question'), ('question-square', 'square-question'), ('quran', 'book-quran'), ('rabbit-fast', 'rabbit-running'), ('radiation-alt', 'circle-radiation'), ('radio-alt', 'radio-tuner'), ('random', 'shuffle'), ('rectangle-landscape', 'rectangle'), ('rectangle-portrait', 'rectangle-vertical'), ('redo', 'arrow-rotate-right'), ('redo-alt', 'rotate-right'), ('remove-format', 'text-slash'), ('repeat-1-alt', 'arrows-repeat-1'), ('repeat-alt', 'arrows-repeat'), ('retweet-alt', 'arrows-retweet'), ('rss-square', 'square-rss'), ('running', 'person-running'), ('sad-cry', 'face-sad-cry'), ('sad-tear', 'face-sad-tear'), ('save', 'floppy-disk'), ('sax-hot', 'saxophone-fire'), ('scalpel-path', 'scalpel-line-dashed'), ('scanner-image', 'scanner'), ('search', 'magnifying-glass'), ('search-dollar', 'magnifying-glass-dollar'), ('search-location', 'magnifying-glass-location'), ('search-minus', 'magnifying-glass-minus'), ('search-plus', 'magnifying-glass-plus'), ('sensor-alert', 'sensor-triangle-exclamation'), ('sensor-smoke', 'sensor-cloud'), ('share-alt', 'share-nodes'), ('share-alt-square', 'square-share-nodes'), ('share-square', 'share-from-square'), ('shield-alt', 'shield-halved'), ('shipping-fast', 'truck-fast'), ('shipping-timed', 'truck-clock'), ('shopping-bag', 'bag-shopping'), ('shopping-basket', 'basket-shopping'), ('shopping-cart', 'cart-shopping'), ('shuttle-van', 'van-shuttle'), ('sign', 'sign-hanging'), ('sign-in', 'arrow-right-to-bracket'), ('sign-in-alt', 'right-to-bracket'), ('sign-language', 'hands'), ('sign-out', 'arrow-right-from-bracket'), ('sign-out-alt', 'right-from-bracket'), ('signal-1', 'signal-weak'), ('signal-2', 'signal-fair'), ('signal-3', 'signal-good'), ('signal-4', 'signal-strong'), ('signal-alt', 'signal-bars'), ('signal-alt-1', 'signal-bars-weak'), ('signal-alt-2', 'signal-bars-fair'), ('signal-alt-3', 'signal-bars-good'), ('signal-alt-slash', 'signal-bars-slash'), ('skating', 'person-skating'), ('ski-jump', 'person-ski-jumping'), ('ski-lift', 'person-ski-lift'), ('skiing', 'person-skiing'), ('skiing-nordic', 'person-skiing-nordic'), ('slack-hash', 'slack'), ('sledding', 'person-sledding'), ('sliders-h', 'sliders'), ('sliders-h-square', 'square-sliders'), ('sliders-v', 'sliders-up'), ('sliders-v-square', 'square-sliders-vertical'), ('smile', 'face-smile'), ('smile-beam', 'face-smile-beam'), ('smile-plus', 'face-smile-plus'), ('smile-wink', 'face-smile-wink'), ('smoking-ban', 'ban-smoking'), ('sms', 'comment-sms'), ('snapchat-ghost', 'snapchat'), ('snowboarding', 'person-snowboarding'), ('snowmobile', 'person-snowmobiling'), ('sort-alpha-down', 'arrow-down-a-z'), ('sort-alpha-down-alt', 'arrow-down-z-a'), ('sort-alpha-up', 'arrow-up-a-z'), ('sort-alpha-up-alt', 'arrow-up-z-a'), ('sort-alt', 'arrow-down-arrow-up'), ('sort-amount-down', 'arrow-down-wide-short'), ('sort-amount-down-alt', 'arrow-down-short-wide'), ('sort-amount-up', 'arrow-up-wide-short'), ('sort-amount-up-alt', 'arrow-up-short-wide'), ('sort-circle', 'circle-sort'), ('sort-circle-down', 'circle-sort-down'), ('sort-circle-up', 'circle-sort-up'), ('sort-numeric-down', 'arrow-down-1-9'), ('sort-numeric-down-alt', 'arrow-down-9-1'), ('sort-numeric-up', 'arrow-up-1-9'), ('sort-numeric-up-alt', 'arrow-up-9-1'), ('sort-shapes-down', 'arrow-down-triangle-square'), ('sort-shapes-down-alt', 'arrow-down-square-triangle'), ('sort-shapes-up', 'arrow-up-triangle-square'), ('sort-shapes-up-alt', 'arrow-up-square-triangle'), ('sort-size-down', 'arrow-down-big-small'), ('sort-size-down-alt', 'arrow-down-small-big'), ('sort-size-up', 'arrow-up-big-small'), ('sort-size-up-alt', 'arrow-up-small-big'), ('soup', 'bowl-hot'), ('space-shuttle', 'shuttle-space'), ('space-station-moon-alt', 'space-station-moon-construction'), ('square-root-alt', 'square-root-variable'), ('star-half-alt', 'star-half-stroke'), ('starfighter-alt', 'starfighter-twin-ion-engine'), ('step-backward', 'backward-step'), ('step-forward', 'forward-step'), ('sticky-note', 'note-sticky'), ('stop-circle', 'circle-stop'), ('store-alt', 'shop'), ('store-alt-slash', 'shop-slash'), ('stream', 'bars-staggered'), ('subway', 'train-subway'), ('surprise', 'face-surprise'), ('swimmer', 'person-swimming'), ('swimming-pool', 'water-ladder'), ('sync', 'arrows-rotate'), ('sync-alt', 'rotate'), ('table-tennis', 'table-tennis-paddle-ball'), ('tablet-alt', 'tablet-screen-button'), ('tablet-android', 'tablet'), ('tablet-android-alt', 'tablet-screen'), ('tachometer', 'gauge-simple'), ('tachometer-alt', 'gauge'), ('tachometer-alt-average', 'gauge-med'), ('tachometer-alt-fast', 'gauge'), ('tachometer-alt-fastest', 'gauge-max'), ('tachometer-alt-slow', 'gauge-low'), ('tachometer-alt-slowest', 'gauge-min'), ('tachometer-average', 'gauge-simple-med'), ('tachometer-fast', 'gauge-simple'), ('tachometer-fastest', 'gauge-simple-max'), ('tachometer-slow', 'gauge-simple-low'), ('tachometer-slowest', 'gauge-simple-min'), ('tanakh', 'book-tanakh'), ('tasks', 'list-check'), ('tasks-alt', 'bars-progress'), ('telegram-plane', 'telegram'), ('temperature-down', 'temperature-arrow-down'), ('temperature-frigid', 'temperature-snow'), ('temperature-hot', 'temperature-sun'), ('temperature-up', 'temperature-arrow-up'), ('tenge', 'tenge-sign'), ('th', 'table-cells'), ('th-large', 'table-cells-large'), ('th-list', 'table-list'), ('theater-masks', 'masks-theater'), ('thermometer-empty', 'temperature-empty'), ('thermometer-full', 'temperature-full'), ('thermometer-half', 'temperature-half'), ('thermometer-quarter', 'temperature-quarter'), ('thermometer-three-quarters', 'temperature-three-quarters'), ('thumb-tack', 'thumbtack'), ('thunderstorm', 'cloud-bolt'), ('thunderstorm-moon', 'cloud-bolt-moon'), ('thunderstorm-sun', 'cloud-bolt-sun'), ('ticket-alt', 'ticket-simple'), ('times', 'xmark'), ('times-circle', 'circle-xmark'), ('times-hexagon', 'hexagon-xmark'), ('times-octagon', 'octagon-xmark'), ('times-square', 'square-xmark'), ('tint', 'droplet'), ('tint-slash', 'droplet-slash'), ('tired', 'face-tired'), ('toilet-paper-alt', 'toilet-paper-blank'), ('tombstone-alt', 'tombstone-blank'), ('tools', 'screwdriver-wrench'), ('torah', 'scroll-torah'), ('tram', 'train-tram'), ('transgender-alt', 'transgender'), ('trash-alt', 'trash-can'), ('trash-restore', 'trash-arrow-up'), ('trash-restore-alt', 'trash-can-arrow-up'), ('trash-undo-alt', 'trash-can-undo'), ('tree-alt', 'tree-deciduous'), ('triangle-music', 'triangle-instrument'), ('trophy-alt', 'trophy-star'), ('truck-couch', 'truck-ramp-couch'), ('truck-loading', 'truck-ramp-box'), ('tshirt', 'shirt'), ('tv-alt', 'tv'), ('undo', 'arrow-rotate-left'), ('undo-alt', 'rotate-left'), ('university', 'building-columns'), ('unlink', 'link-slash'), ('unlock-alt', 'unlock-keyhole'), ('usd-circle', 'circle-dollar'), ('usd-square', 'square-dollar'), ('user-alt', 'user-large'), ('user-alt-slash', 'user-large-slash'), ('user-chart', 'chart-user'), ('user-circle', 'circle-user'), ('user-cog', 'user-gear'), ('user-edit', 'user-pen'), ('user-friends', 'user-group'), ('user-hard-hat', 'user-helmet-safety'), ('user-md', 'user-doctor'), ('user-md-chat', 'user-doctor-message'), ('user-times', 'user-xmark'), ('users-class', 'screen-users'), ('users-cog', 'users-gear'), ('users-crown', 'user-group-crown'), ('utensil-fork', 'fork'), ('utensil-knife', 'knife'), ('utensil-spoon', 'spoon'), ('utensils-alt', 'fork-knife'), ('vhs', 'cassette-vhs'), ('volleyball-ball', 'volleyball'), ('volume-down', 'volume-low'), ('volume-mute', 'volume-xmark'), ('volume-up', 'volume-high'), ('vote-nay', 'xmark-to-slot'), ('vote-yea', 'check-to-slot'), ('walking', 'person-walking'), ('warehouse-alt', 'warehouse-full'), ('washer', 'washing-machine'), ('water-lower', 'water-arrow-down'), ('water-rise', 'water-arrow-up'), ('waveform-path', 'waveform-lines'), ('webcam', 'camera-web'), ('webcam-slash', 'camera-web-slash'), ('weight', 'weight-scale'), ('wifi-1', 'wifi-weak'), ('wifi-2', 'wifi-fair'), ('window-alt', 'window-flip'), ('window-close', 'rectangle-xmark'), ('wine-glass-alt', 'wine-glass-empty')) AS mapping(from_icon, to_icon)\n)\nUPDATE groups\nSET flair_icon =\n  CASE\n    WHEN flair_icon LIKE 'fab-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN flair_icon LIKE 'far-%' THEN CONCAT('far-', remaps.to_icon)\n    WHEN flair_icon LIKE 'fab fa-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN flair_icon LIKE 'far fa-%' THEN CONCAT('far-', remaps.to_icon)\n    ELSE remaps.to_icon\n  END\nFROM remaps\nWHERE flair_icon = remaps.from_icon\n  OR flair_icon = CONCAT('fa-', remaps.from_icon)\n  OR flair_icon = CONCAT('far-', remaps.from_icon)\n  OR flair_icon = CONCAT('fab-', remaps.from_icon)\n  OR flair_icon = CONCAT('far fa-', remaps.from_icon)\n  OR flair_icon = CONCAT('fab fa-', remaps.from_icon)\n  OR flair_icon = CONCAT('fas fa-', remaps.from_icon);\n")
   -> 0.0064s
-- execute("UPDATE groups\nSET flair_icon =\nCASE\n  WHEN flair_icon LIKE 'fas fa-%' THEN SUBSTRING(flair_icon FROM 8)\n  WHEN flair_icon LIKE 'far fa-%' THEN CONCAT('far-', SUBSTRING(flair_icon FROM 8))\n  WHEN flair_icon LIKE 'fab fa-%' THEN CONCAT('fab-', SUBSTRING(flair_icon FROM 8))\n  WHEN flair_icon LIKE 'fa-%' THEN SUBSTRING(flair_icon FROM 4)\n  ELSE flair_icon\nEND\nWHERE flair_icon LIKE 'fa-%'\n  OR flair_icon LIKE 'far fa-%'\n  OR flair_icon LIKE 'fab fa-%'\n  OR flair_icon LIKE 'fas fa-%';\n")
   -> 0.0004s
-- execute("WITH remaps AS (\n  SELECT from_icon, to_icon FROM (VALUES ('adjust', 'circle-half-stroke'), ('air-freshener', 'spray-can-sparkles'), ('alien-monster', 'alien-8bit'), ('allergies', 'hand-dots'), ('ambulance', 'truck-medical'), ('american-sign-language-interpreting', 'hands-asl-interpreting'), ('analytics', 'chart-mixed'), ('angle-double-down', 'angles-down'), ('angle-double-left', 'angles-left'), ('angle-double-right', 'angles-right'), ('angle-double-up', 'angles-up'), ('angry', 'face-angry'), ('apple-alt', 'apple-whole'), ('apple-crate', 'crate-apple'), ('archive', 'box-archive'), ('arrow-alt-circle-down', 'circle-down'), ('arrow-alt-circle-left', 'circle-left'), ('arrow-alt-circle-right', 'circle-right'), ('arrow-alt-circle-up', 'circle-up'), ('arrow-alt-down', 'down'), ('arrow-alt-from-bottom', 'up-from-line'), ('arrow-alt-from-left', 'right-from-line'), ('arrow-alt-from-right', 'left-from-line'), ('arrow-alt-from-top', 'down-from-line'), ('arrow-alt-left', 'left'), ('arrow-alt-right', 'right'), ('arrow-alt-square-down', 'square-down'), ('arrow-alt-square-left', 'square-left'), ('arrow-alt-square-right', 'square-right'), ('arrow-alt-square-up', 'square-up'), ('arrow-alt-to-bottom', 'down-to-line'), ('arrow-alt-to-left', 'left-to-line'), ('arrow-alt-to-right', 'right-to-line'), ('arrow-alt-to-top', 'up-to-line'), ('arrow-alt-up', 'up'), ('arrow-circle-down', 'circle-arrow-down'), ('arrow-circle-left', 'circle-arrow-left'), ('arrow-circle-right', 'circle-arrow-right'), ('arrow-circle-up', 'circle-arrow-up'), ('arrow-from-bottom', 'arrow-up-from-line'), ('arrow-from-left', 'arrow-right-from-line'), ('arrow-from-right', 'arrow-left-from-line'), ('arrow-from-top', 'arrow-down-from-line'), ('arrow-square-down', 'square-arrow-down'), ('arrow-square-left', 'square-arrow-left'), ('arrow-square-right', 'square-arrow-right'), ('arrow-square-up', 'square-arrow-up'), ('arrow-to-bottom', 'arrow-down-to-line'), ('arrow-to-left', 'arrow-left-to-line'), ('arrow-to-right', 'arrow-right-to-line'), ('arrow-to-top', 'arrow-up-to-line'), ('arrows', 'arrows-up-down-left-right'), ('arrows-alt', 'up-down-left-right'), ('arrows-alt-h', 'left-right'), ('arrows-alt-v', 'up-down'), ('arrows-h', 'arrows-left-right'), ('arrows-v', 'arrows-up-down'), ('assistive-listening-systems', 'ear-listen'), ('atlas', 'book-atlas'), ('atom-alt', 'atom-simple'), ('backspace', 'delete-left'), ('balance-scale', 'scale-balanced'), ('balance-scale-left', 'scale-unbalanced'), ('balance-scale-right', 'scale-unbalanced-flip'), ('band-aid', 'bandage'), ('barcode-alt', 'rectangle-barcode'), ('baseball-ball', 'baseball'), ('basketball-ball', 'basketball'), ('bed-alt', 'bed-front'), ('beer', 'beer-mug-empty'), ('betamax', 'cassette-betamax'), ('bible', 'book-bible'), ('biking', 'person-biking'), ('biking-mountain', 'person-biking-mountain'), ('birthday-cake', 'cake-candles'), ('blind', 'person-walking-with-cane'), ('book-alt', 'book-blank'), ('book-dead', 'book-skull'), ('book-reader', 'book-open-reader'), ('book-spells', 'book-sparkles'), ('border-style', 'border-top-left'), ('border-style-alt', 'border-bottom-right'), ('box-alt', 'box-taped'), ('box-fragile', 'square-fragile'), ('box-full', 'box-open-full'), ('box-up', 'square-this-way-up'), ('box-usd', 'box-dollar'), ('boxes', 'boxes-stacked'), ('boxes-alt', 'boxes-stacked'), ('brackets', 'brackets-square'), ('broadcast-tower', 'tower-broadcast'), ('burn', 'fire-flame-simple'), ('bus-alt', 'bus-simple'), ('calculator-alt', 'calculator-simple'), ('calendar-alt', 'calendar-days'), ('calendar-edit', 'calendar-pen'), ('calendar-times', 'calendar-xmark'), ('camera-alt', 'camera'), ('camera-home', 'camera-security'), ('car-alt', 'car-rear'), ('car-crash', 'car-burst'), ('car-mechanic', 'car-wrench'), ('caravan-alt', 'caravan-simple'), ('caret-circle-down', 'circle-caret-down'), ('caret-circle-left', 'circle-caret-left'), ('caret-circle-right', 'circle-caret-right'), ('caret-circle-up', 'circle-caret-up'), ('caret-square-down', 'square-caret-down'), ('caret-square-left', 'square-caret-left'), ('caret-square-right', 'square-caret-right'), ('caret-square-up', 'square-caret-up'), ('cctv', 'camera-cctv'), ('chalkboard-teacher', 'chalkboard-user'), ('chart-pie-alt', 'chart-pie-simple'), ('check-circle', 'circle-check'), ('check-square', 'square-check'), ('cheeseburger', 'burger-cheese'), ('chess-bishop-alt', 'chess-bishop-piece'), ('chess-clock-alt', 'chess-clock-flip'), ('chess-king-alt', 'chess-king-piece'), ('chess-knight-alt', 'chess-knight-piece'), ('chess-pawn-alt', 'chess-pawn-piece'), ('chess-queen-alt', 'chess-queen-piece'), ('chess-rook-alt', 'chess-rook-piece'), ('chevron-circle-down', 'circle-chevron-down'), ('chevron-circle-left', 'circle-chevron-left'), ('chevron-circle-right', 'circle-chevron-right'), ('chevron-circle-up', 'circle-chevron-up'), ('chevron-double-down', 'chevrons-down'), ('chevron-double-left', 'chevrons-left'), ('chevron-double-right', 'chevrons-right'), ('chevron-double-up', 'chevrons-up'), ('chevron-square-down', 'square-chevron-down'), ('chevron-square-left', 'square-chevron-left'), ('chevron-square-right', 'square-chevron-right'), ('chevron-square-up', 'square-chevron-up'), ('clinic-medical', 'house-chimney-medical'), ('cloud-download', 'cloud-arrow-down'), ('cloud-download-alt', 'cloud-arrow-down'), ('cloud-upload', 'cloud-arrow-up'), ('cloud-upload-alt', 'cloud-arrow-up'), ('cocktail', 'martini-glass-citrus'), ('coffee', 'mug-saucer'), ('coffee-togo', 'cup-togo'), ('cog', 'gear'), ('cogs', 'gears'), ('columns', 'table-columns'), ('comment-alt', 'message'), ('comment-alt-check', 'message-check'), ('comment-alt-dollar', 'message-dollar'), ('comment-alt-dots', 'message-dots'), ('comment-alt-edit', 'message-pen'), ('comment-alt-exclamation', 'message-exclamation'), ('comment-alt-lines', 'message-lines'), ('comment-alt-medical', 'message-medical'), ('comment-alt-minus', 'message-minus'), ('comment-alt-music', 'message-music'), ('comment-alt-plus', 'message-plus'), ('comment-alt-slash', 'message-slash'), ('comment-alt-smile', 'message-smile'), ('comment-alt-times', 'message-xmark'), ('comment-edit', 'comment-pen'), ('comment-times', 'comment-xmark'), ('comments-alt', 'messages'), ('comments-alt-dollar', 'messages-dollar'), ('compress-alt', 'down-left-and-up-right-to-center'), ('compress-arrows-alt', 'minimize'), ('concierge-bell', 'bell-concierge'), ('construction', 'triangle-person-digging'), ('conveyor-belt-alt', 'conveyor-belt-boxes'), ('cowbell-more', 'cowbell-circle-plus'), ('cricket', 'cricket-bat-ball'), ('crop-alt', 'crop-simple'), ('curling', 'curling-stone'), ('cut', 'scissors'), ('deaf', 'ear-deaf'), ('debug', 'ban-bug'), ('desktop-alt', 'desktop'), ('dewpoint', 'droplet-degree'), ('diagnoses', 'person-dots-from-line'), ('digging', 'person-digging'), ('digital-tachograph', 'tachograph-digital'), ('directions', 'diamond-turn-right'), ('dizzy', 'face-dizzy'), ('dolly-flatbed', 'cart-flatbed'), ('dolly-flatbed-alt', 'cart-flatbed-boxes'), ('dolly-flatbed-empty', 'cart-flatbed-empty'), ('donate', 'circle-dollar-to-slot'), ('dot-circle', 'circle-dot'), ('drafting-compass', 'compass-drafting'), ('drone-alt', 'drone-front'), ('dryer-alt', 'dryer-heat'), ('eclipse-alt', 'moon-over-sun'), ('edit', 'pen-to-square'), ('ellipsis-h', 'ellipsis'), ('ellipsis-h-alt', 'ellipsis-stroke'), ('ellipsis-v', 'ellipsis-vertical'), ('ellipsis-v-alt', 'ellipsis-stroke-vertical'), ('envelope-square', 'square-envelope'), ('exchange', 'arrow-right-arrow-left'), ('exchange-alt', 'right-left'), ('exclamation-circle', 'circle-exclamation'), ('exclamation-square', 'square-exclamation'), ('exclamation-triangle', 'triangle-exclamation'), ('expand-alt', 'up-right-and-down-left-from-center'), ('expand-arrows', 'arrows-maximize'), ('expand-arrows-alt', 'maximize'), ('external-link', 'arrow-up-right-from-square'), ('external-link-alt', 'up-right-from-square'), ('external-link-square', 'square-arrow-up-right'), ('external-link-square-alt', 'square-up-right'), ('eyedropper', 'eye-dropper'), ('fast-backward', 'backward-fast'), ('fast-forward', 'forward-fast'), ('feather-alt', 'feather-pointed'), ('female', 'person-dress'), ('field-hockey', 'field-hockey-stick-ball'), ('fighter-jet', 'jet-fighter'), ('file-alt', 'file-lines'), ('file-archive', 'file-zipper'), ('file-chart-line', 'file-chart-column'), ('file-download', 'file-arrow-down'), ('file-edit', 'file-pen'), ('file-medical-alt', 'file-waveform'), ('file-search', 'file-magnifying-glass'), ('file-times', 'file-xmark'), ('file-upload', 'file-arrow-up'), ('film-alt', 'film-simple'), ('fire-alt', 'fire-flame-curved'), ('first-aid', 'kit-medical'), ('fist-raised', 'hand-fist'), ('flag-alt', 'flag-swallowtail'), ('flame', 'fire-flame'), ('flask-poison', 'flask-round-poison'), ('flask-potion', 'flask-round-potion'), ('flushed', 'face-flushed'), ('fog', 'cloud-fog'), ('folder-download', 'folder-arrow-down'), ('folder-times', 'folder-xmark'), ('folder-upload', 'folder-arrow-up'), ('font-awesome-alt', 'square-font-awesome-stroke'), ('font-awesome-flag', 'font-awesome'), ('font-awesome-logo-full', 'font-awesome'), ('football-ball', 'football'), ('fragile', 'wine-glass-crack'), ('frosty-head', 'snowman-head'), ('frown', 'face-frown'), ('frown-open', 'face-frown-open'), ('funnel-dollar', 'filter-circle-dollar'), ('game-board-alt', 'game-board-simple'), ('gamepad-alt', 'gamepad-modern'), ('glass-champagne', 'champagne-glass'), ('glass-cheers', 'champagne-glasses'), ('glass-martini', 'martini-glass-empty'), ('glass-martini-alt', 'martini-glass'), ('glass-whiskey', 'whiskey-glass'), ('glass-whiskey-rocks', 'whiskey-glass-ice'), ('glasses-alt', 'glasses-round'), ('globe-africa', 'earth-africa'), ('globe-americas', 'earth-americas'), ('globe-asia', 'earth-asia'), ('globe-europe', 'earth-europe'), ('golf-ball', 'golf-ball-tee'), ('grimace', 'face-grimace'), ('grin', 'face-grin'), ('grin-alt', 'face-grin-wide'), ('grin-beam', 'face-grin-beam'), ('grin-beam-sweat', 'face-grin-beam-sweat'), ('grin-hearts', 'face-grin-hearts'), ('grin-squint', 'face-grin-squint'), ('grin-squint-tears', 'face-grin-squint-tears'), ('grin-stars', 'face-grin-stars'), ('grin-tears', 'face-grin-tears'), ('grin-tongue', 'face-grin-tongue'), ('grin-tongue-squint', 'face-grin-tongue-squint'), ('grin-tongue-wink', 'face-grin-tongue-wink'), ('grin-wink', 'face-grin-wink'), ('grip-horizontal', 'grip'), ('h-square', 'square-h'), ('hamburger', 'burger'), ('hand-holding-usd', 'hand-holding-dollar'), ('hand-holding-water', 'hand-holding-droplet'), ('hand-paper', 'hand'), ('hand-receiving', 'hands-holding-diamond'), ('hand-rock', 'hand-back-fist'), ('hands-heart', 'hands-holding-heart'), ('hands-helping', 'handshake-angle'), ('hands-usd', 'hands-holding-dollar'), ('hands-wash', 'hands-bubbles'), ('handshake-alt', 'handshake-simple'), ('handshake-alt-slash', 'handshake-simple-slash'), ('hard-hat', 'helmet-safety'), ('hdd', 'hard-drive'), ('head-vr', 'head-side-goggles'), ('headphones-alt', 'headphones-simple'), ('heart-broken', 'heart-crack'), ('heart-circle', 'circle-heart'), ('heart-rate', 'wave-pulse'), ('heart-square', 'square-heart'), ('heartbeat', 'heart-pulse'), ('hiking', 'person-hiking'), ('history', 'clock-rotate-left'), ('home', 'house'), ('home-alt', 'house'), ('home-heart', 'house-heart'), ('home-lg', 'house-chimney'), ('home-lg-alt', 'house'), ('hospital-alt', 'hospital'), ('hospital-symbol', 'circle-h'), ('hot-tub', 'hot-tub-person'), ('hourglass-half', 'hourglass'), ('house-damage', 'house-chimney-crack'), ('house-leave', 'house-person-leave'), ('house-return', 'house-person-return'), ('hryvnia', 'hryvnia-sign'), ('humidity', 'droplet-percent'), ('icons-alt', 'symbols'), ('id-card-alt', 'id-card-clip'), ('industry-alt', 'industry-windows'), ('info-circle', 'circle-info'), ('info-square', 'square-info'), ('innosoft', '42-group'), ('inventory', 'shelves'), ('journal-whills', 'book-journal-whills'), ('kiss', 'face-kiss'), ('kiss-beam', 'face-kiss-beam'), ('kiss-wink-heart', 'face-kiss-wink-heart'), ('landmark-alt', 'landmark-dome'), ('laptop-house', 'house-laptop'), ('laugh', 'face-laugh'), ('laugh-beam', 'face-laugh-beam'), ('laugh-squint', 'face-laugh-squint'), ('laugh-wink', 'face-laugh-wink'), ('level-down', 'arrow-turn-down'), ('level-down-alt', 'turn-down'), ('level-up', 'arrow-turn-up'), ('level-up-alt', 'turn-up'), ('list-alt', 'rectangle-list'), ('location', 'location-crosshairs'), ('location-circle', 'circle-location-arrow'), ('location-slash', 'location-crosshairs-slash'), ('lock-alt', 'lock-keyhole'), ('lock-open-alt', 'lock-keyhole-open'), ('long-arrow-alt-down', 'down-long'), ('long-arrow-alt-left', 'left-long'), ('long-arrow-alt-right', 'right-long'), ('long-arrow-alt-up', 'up-long'), ('long-arrow-down', 'arrow-down-long'), ('long-arrow-left', 'arrow-left-long'), ('long-arrow-right', 'arrow-right-long'), ('long-arrow-up', 'arrow-up-long'), ('low-vision', 'eye-low-vision'), ('luchador', 'luchador-mask'), ('luggage-cart', 'cart-flatbed-suitcase'), ('magic', 'wand-magic'), ('mail-bulk', 'envelopes-bulk'), ('male', 'person'), ('map-marked', 'map-location'), ('map-marked-alt', 'map-location-dot'), ('map-marker', 'location-pin'), ('map-marker-alt', 'location-dot'), ('map-marker-alt-slash', 'location-dot-slash'), ('map-marker-check', 'location-check'), ('map-marker-edit', 'location-pen'), ('map-marker-exclamation', 'location-exclamation'), ('map-marker-minus', 'location-minus'), ('map-marker-plus', 'location-plus'), ('map-marker-question', 'location-question'), ('map-marker-slash', 'location-pin-slash'), ('map-marker-smile', 'location-smile'), ('map-marker-times', 'location-xmark'), ('map-signs', 'signs-post'), ('mars-stroke-h', 'mars-stroke-right'), ('mars-stroke-v', 'mars-stroke-up'), ('medium-m', 'medium'), ('medkit', 'suitcase-medical'), ('meh', 'face-meh'), ('meh-blank', 'face-meh-blank'), ('meh-rolling-eyes', 'face-rolling-eyes'), ('microphone-alt', 'microphone-lines'), ('microphone-alt-slash', 'microphone-lines-slash'), ('mind-share', 'brain-arrow-curved-right'), ('minus-circle', 'circle-minus'), ('minus-hexagon', 'hexagon-minus'), ('minus-octagon', 'octagon-minus'), ('minus-square', 'square-minus'), ('mobile-alt', 'mobile-screen-button'), ('mobile-android', 'mobile'), ('mobile-android-alt', 'mobile-screen'), ('money-bill-alt', 'money-bill-1'), ('money-bill-wave-alt', 'money-bill-1-wave'), ('money-check-alt', 'money-check-dollar'), ('money-check-edit', 'money-check-pen'), ('money-check-edit-alt', 'money-check-dollar-pen'), ('monitor-heart-rate', 'monitor-waveform'), ('mouse', 'computer-mouse'), ('mouse-alt', 'computer-mouse-scrollwheel'), ('mouse-pointer', 'arrow-pointer'), ('music-alt', 'music-note'), ('music-alt-slash', 'music-note-slash'), ('oil-temp', 'oil-temperature'), ('page-break', 'file-dashed-line'), ('paint-brush', 'paintbrush'), ('paint-brush-alt', 'paintbrush-fine'), ('paint-brush-fine', 'paintbrush-fine'), ('pallet-alt', 'pallet-boxes'), ('paragraph-rtl', 'paragraph-left'), ('parking', 'square-parking'), ('parking-circle', 'circle-parking'), ('parking-circle-slash', 'ban-parking'), ('parking-slash', 'square-parking-slash'), ('pastafarianism', 'spaghetti-monster-flying'), ('pause-circle', 'circle-pause'), ('paw-alt', 'paw-simple'), ('pen-alt', 'pen-clip'), ('pen-square', 'square-pen'), ('pencil-alt', 'pencil'), ('pencil-paintbrush', 'pen-paintbrush'), ('pencil-ruler', 'pen-ruler'), ('pennant', 'flag-pennant'), ('people-arrows', 'people-arrows-left-right'), ('people-carry', 'people-carry-box'), ('percentage', 'percent'), ('person-carry', 'person-carry-box'), ('phone-alt', 'phone-flip'), ('phone-laptop', 'laptop-mobile'), ('phone-square', 'square-phone'), ('phone-square-alt', 'square-phone-flip'), ('photo-video', 'photo-film'), ('plane-alt', 'plane-engines'), ('play-circle', 'circle-play'), ('plus-circle', 'circle-plus'), ('plus-hexagon', 'hexagon-plus'), ('plus-octagon', 'octagon-plus'), ('plus-square', 'square-plus'), ('poll', 'square-poll-vertical'), ('poll-h', 'square-poll-horizontal'), ('portal-enter', 'person-to-portal'), ('portal-exit', 'person-from-portal'), ('portrait', 'image-portrait'), ('pound-sign', 'sterling-sign'), ('pray', 'person-praying'), ('praying-hands', 'hands-praying'), ('prescription-bottle-alt', 'prescription-bottle-medical'), ('presentation', 'presentation-screen'), ('print-search', 'print-magnifying-glass'), ('procedures', 'bed-pulse'), ('project-diagram', 'diagram-project'), ('question-circle', 'circle-question'), ('question-square', 'square-question'), ('quran', 'book-quran'), ('rabbit-fast', 'rabbit-running'), ('radiation-alt', 'circle-radiation'), ('radio-alt', 'radio-tuner'), ('random', 'shuffle'), ('rectangle-landscape', 'rectangle'), ('rectangle-portrait', 'rectangle-vertical'), ('redo', 'arrow-rotate-right'), ('redo-alt', 'rotate-right'), ('remove-format', 'text-slash'), ('repeat-1-alt', 'arrows-repeat-1'), ('repeat-alt', 'arrows-repeat'), ('retweet-alt', 'arrows-retweet'), ('rss-square', 'square-rss'), ('running', 'person-running'), ('sad-cry', 'face-sad-cry'), ('sad-tear', 'face-sad-tear'), ('save', 'floppy-disk'), ('sax-hot', 'saxophone-fire'), ('scalpel-path', 'scalpel-line-dashed'), ('scanner-image', 'scanner'), ('search', 'magnifying-glass'), ('search-dollar', 'magnifying-glass-dollar'), ('search-location', 'magnifying-glass-location'), ('search-minus', 'magnifying-glass-minus'), ('search-plus', 'magnifying-glass-plus'), ('sensor-alert', 'sensor-triangle-exclamation'), ('sensor-smoke', 'sensor-cloud'), ('share-alt', 'share-nodes'), ('share-alt-square', 'square-share-nodes'), ('share-square', 'share-from-square'), ('shield-alt', 'shield-halved'), ('shipping-fast', 'truck-fast'), ('shipping-timed', 'truck-clock'), ('shopping-bag', 'bag-shopping'), ('shopping-basket', 'basket-shopping'), ('shopping-cart', 'cart-shopping'), ('shuttle-van', 'van-shuttle'), ('sign', 'sign-hanging'), ('sign-in', 'arrow-right-to-bracket'), ('sign-in-alt', 'right-to-bracket'), ('sign-language', 'hands'), ('sign-out', 'arrow-right-from-bracket'), ('sign-out-alt', 'right-from-bracket'), ('signal-1', 'signal-weak'), ('signal-2', 'signal-fair'), ('signal-3', 'signal-good'), ('signal-4', 'signal-strong'), ('signal-alt', 'signal-bars'), ('signal-alt-1', 'signal-bars-weak'), ('signal-alt-2', 'signal-bars-fair'), ('signal-alt-3', 'signal-bars-good'), ('signal-alt-slash', 'signal-bars-slash'), ('skating', 'person-skating'), ('ski-jump', 'person-ski-jumping'), ('ski-lift', 'person-ski-lift'), ('skiing', 'person-skiing'), ('skiing-nordic', 'person-skiing-nordic'), ('slack-hash', 'slack'), ('sledding', 'person-sledding'), ('sliders-h', 'sliders'), ('sliders-h-square', 'square-sliders'), ('sliders-v', 'sliders-up'), ('sliders-v-square', 'square-sliders-vertical'), ('smile', 'face-smile'), ('smile-beam', 'face-smile-beam'), ('smile-plus', 'face-smile-plus'), ('smile-wink', 'face-smile-wink'), ('smoking-ban', 'ban-smoking'), ('sms', 'comment-sms'), ('snapchat-ghost', 'snapchat'), ('snowboarding', 'person-snowboarding'), ('snowmobile', 'person-snowmobiling'), ('sort-alpha-down', 'arrow-down-a-z'), ('sort-alpha-down-alt', 'arrow-down-z-a'), ('sort-alpha-up', 'arrow-up-a-z'), ('sort-alpha-up-alt', 'arrow-up-z-a'), ('sort-alt', 'arrow-down-arrow-up'), ('sort-amount-down', 'arrow-down-wide-short'), ('sort-amount-down-alt', 'arrow-down-short-wide'), ('sort-amount-up', 'arrow-up-wide-short'), ('sort-amount-up-alt', 'arrow-up-short-wide'), ('sort-circle', 'circle-sort'), ('sort-circle-down', 'circle-sort-down'), ('sort-circle-up', 'circle-sort-up'), ('sort-numeric-down', 'arrow-down-1-9'), ('sort-numeric-down-alt', 'arrow-down-9-1'), ('sort-numeric-up', 'arrow-up-1-9'), ('sort-numeric-up-alt', 'arrow-up-9-1'), ('sort-shapes-down', 'arrow-down-triangle-square'), ('sort-shapes-down-alt', 'arrow-down-square-triangle'), ('sort-shapes-up', 'arrow-up-triangle-square'), ('sort-shapes-up-alt', 'arrow-up-square-triangle'), ('sort-size-down', 'arrow-down-big-small'), ('sort-size-down-alt', 'arrow-down-small-big'), ('sort-size-up', 'arrow-up-big-small'), ('sort-size-up-alt', 'arrow-up-small-big'), ('soup', 'bowl-hot'), ('space-shuttle', 'shuttle-space'), ('space-station-moon-alt', 'space-station-moon-construction'), ('square-root-alt', 'square-root-variable'), ('star-half-alt', 'star-half-stroke'), ('starfighter-alt', 'starfighter-twin-ion-engine'), ('step-backward', 'backward-step'), ('step-forward', 'forward-step'), ('sticky-note', 'note-sticky'), ('stop-circle', 'circle-stop'), ('store-alt', 'shop'), ('store-alt-slash', 'shop-slash'), ('stream', 'bars-staggered'), ('subway', 'train-subway'), ('surprise', 'face-surprise'), ('swimmer', 'person-swimming'), ('swimming-pool', 'water-ladder'), ('sync', 'arrows-rotate'), ('sync-alt', 'rotate'), ('table-tennis', 'table-tennis-paddle-ball'), ('tablet-alt', 'tablet-screen-button'), ('tablet-android', 'tablet'), ('tablet-android-alt', 'tablet-screen'), ('tachometer', 'gauge-simple'), ('tachometer-alt', 'gauge'), ('tachometer-alt-average', 'gauge-med'), ('tachometer-alt-fast', 'gauge'), ('tachometer-alt-fastest', 'gauge-max'), ('tachometer-alt-slow', 'gauge-low'), ('tachometer-alt-slowest', 'gauge-min'), ('tachometer-average', 'gauge-simple-med'), ('tachometer-fast', 'gauge-simple'), ('tachometer-fastest', 'gauge-simple-max'), ('tachometer-slow', 'gauge-simple-low'), ('tachometer-slowest', 'gauge-simple-min'), ('tanakh', 'book-tanakh'), ('tasks', 'list-check'), ('tasks-alt', 'bars-progress'), ('telegram-plane', 'telegram'), ('temperature-down', 'temperature-arrow-down'), ('temperature-frigid', 'temperature-snow'), ('temperature-hot', 'temperature-sun'), ('temperature-up', 'temperature-arrow-up'), ('tenge', 'tenge-sign'), ('th', 'table-cells'), ('th-large', 'table-cells-large'), ('th-list', 'table-list'), ('theater-masks', 'masks-theater'), ('thermometer-empty', 'temperature-empty'), ('thermometer-full', 'temperature-full'), ('thermometer-half', 'temperature-half'), ('thermometer-quarter', 'temperature-quarter'), ('thermometer-three-quarters', 'temperature-three-quarters'), ('thumb-tack', 'thumbtack'), ('thunderstorm', 'cloud-bolt'), ('thunderstorm-moon', 'cloud-bolt-moon'), ('thunderstorm-sun', 'cloud-bolt-sun'), ('ticket-alt', 'ticket-simple'), ('times', 'xmark'), ('times-circle', 'circle-xmark'), ('times-hexagon', 'hexagon-xmark'), ('times-octagon', 'octagon-xmark'), ('times-square', 'square-xmark'), ('tint', 'droplet'), ('tint-slash', 'droplet-slash'), ('tired', 'face-tired'), ('toilet-paper-alt', 'toilet-paper-blank'), ('tombstone-alt', 'tombstone-blank'), ('tools', 'screwdriver-wrench'), ('torah', 'scroll-torah'), ('tram', 'train-tram'), ('transgender-alt', 'transgender'), ('trash-alt', 'trash-can'), ('trash-restore', 'trash-arrow-up'), ('trash-restore-alt', 'trash-can-arrow-up'), ('trash-undo-alt', 'trash-can-undo'), ('tree-alt', 'tree-deciduous'), ('triangle-music', 'triangle-instrument'), ('trophy-alt', 'trophy-star'), ('truck-couch', 'truck-ramp-couch'), ('truck-loading', 'truck-ramp-box'), ('tshirt', 'shirt'), ('tv-alt', 'tv'), ('undo', 'arrow-rotate-left'), ('undo-alt', 'rotate-left'), ('university', 'building-columns'), ('unlink', 'link-slash'), ('unlock-alt', 'unlock-keyhole'), ('usd-circle', 'circle-dollar'), ('usd-square', 'square-dollar'), ('user-alt', 'user-large'), ('user-alt-slash', 'user-large-slash'), ('user-chart', 'chart-user'), ('user-circle', 'circle-user'), ('user-cog', 'user-gear'), ('user-edit', 'user-pen'), ('user-friends', 'user-group'), ('user-hard-hat', 'user-helmet-safety'), ('user-md', 'user-doctor'), ('user-md-chat', 'user-doctor-message'), ('user-times', 'user-xmark'), ('users-class', 'screen-users'), ('users-cog', 'users-gear'), ('users-crown', 'user-group-crown'), ('utensil-fork', 'fork'), ('utensil-knife', 'knife'), ('utensil-spoon', 'spoon'), ('utensils-alt', 'fork-knife'), ('vhs', 'cassette-vhs'), ('volleyball-ball', 'volleyball'), ('volume-down', 'volume-low'), ('volume-mute', 'volume-xmark'), ('volume-up', 'volume-high'), ('vote-nay', 'xmark-to-slot'), ('vote-yea', 'check-to-slot'), ('walking', 'person-walking'), ('warehouse-alt', 'warehouse-full'), ('washer', 'washing-machine'), ('water-lower', 'water-arrow-down'), ('water-rise', 'water-arrow-up'), ('waveform-path', 'waveform-lines'), ('webcam', 'camera-web'), ('webcam-slash', 'camera-web-slash'), ('weight', 'weight-scale'), ('wifi-1', 'wifi-weak'), ('wifi-2', 'wifi-fair'), ('window-alt', 'window-flip'), ('window-close', 'rectangle-xmark'), ('wine-glass-alt', 'wine-glass-empty')) AS mapping(from_icon, to_icon)\n)\nUPDATE post_action_types\nSET icon =\n  CASE\n    WHEN icon LIKE 'fab-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far-%' THEN CONCAT('far-', remaps.to_icon)\n    WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', remaps.to_icon)\n    ELSE remaps.to_icon\n  END\nFROM remaps\nWHERE icon = remaps.from_icon\n  OR icon = CONCAT('fa-', remaps.from_icon)\n  OR icon = CONCAT('far-', remaps.from_icon)\n  OR icon = CONCAT('fab-', remaps.from_icon)\n  OR icon = CONCAT('far fa-', remaps.from_icon)\n  OR icon = CONCAT('fab fa-', remaps.from_icon)\n  OR icon = CONCAT('fas fa-', remaps.from_icon);\n")
   -> 0.0056s
-- execute("UPDATE post_action_types\nSET icon =\nCASE\n  WHEN icon LIKE 'fas fa-%' THEN SUBSTRING(icon FROM 8)\n  WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fa-%' THEN SUBSTRING(icon FROM 4)\n  ELSE icon\nEND\nWHERE icon LIKE 'fa-%'\n  OR icon LIKE 'far fa-%'\n  OR icon LIKE 'fab fa-%'\n  OR icon LIKE 'fas fa-%';\n")
   -> 0.0003s
-- execute("WITH remaps AS (\n  SELECT from_icon, to_icon FROM (VALUES ('adjust', 'circle-half-stroke'), ('air-freshener', 'spray-can-sparkles'), ('alien-monster', 'alien-8bit'), ('allergies', 'hand-dots'), ('ambulance', 'truck-medical'), ('american-sign-language-interpreting', 'hands-asl-interpreting'), ('analytics', 'chart-mixed'), ('angle-double-down', 'angles-down'), ('angle-double-left', 'angles-left'), ('angle-double-right', 'angles-right'), ('angle-double-up', 'angles-up'), ('angry', 'face-angry'), ('apple-alt', 'apple-whole'), ('apple-crate', 'crate-apple'), ('archive', 'box-archive'), ('arrow-alt-circle-down', 'circle-down'), ('arrow-alt-circle-left', 'circle-left'), ('arrow-alt-circle-right', 'circle-right'), ('arrow-alt-circle-up', 'circle-up'), ('arrow-alt-down', 'down'), ('arrow-alt-from-bottom', 'up-from-line'), ('arrow-alt-from-left', 'right-from-line'), ('arrow-alt-from-right', 'left-from-line'), ('arrow-alt-from-top', 'down-from-line'), ('arrow-alt-left', 'left'), ('arrow-alt-right', 'right'), ('arrow-alt-square-down', 'square-down'), ('arrow-alt-square-left', 'square-left'), ('arrow-alt-square-right', 'square-right'), ('arrow-alt-square-up', 'square-up'), ('arrow-alt-to-bottom', 'down-to-line'), ('arrow-alt-to-left', 'left-to-line'), ('arrow-alt-to-right', 'right-to-line'), ('arrow-alt-to-top', 'up-to-line'), ('arrow-alt-up', 'up'), ('arrow-circle-down', 'circle-arrow-down'), ('arrow-circle-left', 'circle-arrow-left'), ('arrow-circle-right', 'circle-arrow-right'), ('arrow-circle-up', 'circle-arrow-up'), ('arrow-from-bottom', 'arrow-up-from-line'), ('arrow-from-left', 'arrow-right-from-line'), ('arrow-from-right', 'arrow-left-from-line'), ('arrow-from-top', 'arrow-down-from-line'), ('arrow-square-down', 'square-arrow-down'), ('arrow-square-left', 'square-arrow-left'), ('arrow-square-right', 'square-arrow-right'), ('arrow-square-up', 'square-arrow-up'), ('arrow-to-bottom', 'arrow-down-to-line'), ('arrow-to-left', 'arrow-left-to-line'), ('arrow-to-right', 'arrow-right-to-line'), ('arrow-to-top', 'arrow-up-to-line'), ('arrows', 'arrows-up-down-left-right'), ('arrows-alt', 'up-down-left-right'), ('arrows-alt-h', 'left-right'), ('arrows-alt-v', 'up-down'), ('arrows-h', 'arrows-left-right'), ('arrows-v', 'arrows-up-down'), ('assistive-listening-systems', 'ear-listen'), ('atlas', 'book-atlas'), ('atom-alt', 'atom-simple'), ('backspace', 'delete-left'), ('balance-scale', 'scale-balanced'), ('balance-scale-left', 'scale-unbalanced'), ('balance-scale-right', 'scale-unbalanced-flip'), ('band-aid', 'bandage'), ('barcode-alt', 'rectangle-barcode'), ('baseball-ball', 'baseball'), ('basketball-ball', 'basketball'), ('bed-alt', 'bed-front'), ('beer', 'beer-mug-empty'), ('betamax', 'cassette-betamax'), ('bible', 'book-bible'), ('biking', 'person-biking'), ('biking-mountain', 'person-biking-mountain'), ('birthday-cake', 'cake-candles'), ('blind', 'person-walking-with-cane'), ('book-alt', 'book-blank'), ('book-dead', 'book-skull'), ('book-reader', 'book-open-reader'), ('book-spells', 'book-sparkles'), ('border-style', 'border-top-left'), ('border-style-alt', 'border-bottom-right'), ('box-alt', 'box-taped'), ('box-fragile', 'square-fragile'), ('box-full', 'box-open-full'), ('box-up', 'square-this-way-up'), ('box-usd', 'box-dollar'), ('boxes', 'boxes-stacked'), ('boxes-alt', 'boxes-stacked'), ('brackets', 'brackets-square'), ('broadcast-tower', 'tower-broadcast'), ('burn', 'fire-flame-simple'), ('bus-alt', 'bus-simple'), ('calculator-alt', 'calculator-simple'), ('calendar-alt', 'calendar-days'), ('calendar-edit', 'calendar-pen'), ('calendar-times', 'calendar-xmark'), ('camera-alt', 'camera'), ('camera-home', 'camera-security'), ('car-alt', 'car-rear'), ('car-crash', 'car-burst'), ('car-mechanic', 'car-wrench'), ('caravan-alt', 'caravan-simple'), ('caret-circle-down', 'circle-caret-down'), ('caret-circle-left', 'circle-caret-left'), ('caret-circle-right', 'circle-caret-right'), ('caret-circle-up', 'circle-caret-up'), ('caret-square-down', 'square-caret-down'), ('caret-square-left', 'square-caret-left'), ('caret-square-right', 'square-caret-right'), ('caret-square-up', 'square-caret-up'), ('cctv', 'camera-cctv'), ('chalkboard-teacher', 'chalkboard-user'), ('chart-pie-alt', 'chart-pie-simple'), ('check-circle', 'circle-check'), ('check-square', 'square-check'), ('cheeseburger', 'burger-cheese'), ('chess-bishop-alt', 'chess-bishop-piece'), ('chess-clock-alt', 'chess-clock-flip'), ('chess-king-alt', 'chess-king-piece'), ('chess-knight-alt', 'chess-knight-piece'), ('chess-pawn-alt', 'chess-pawn-piece'), ('chess-queen-alt', 'chess-queen-piece'), ('chess-rook-alt', 'chess-rook-piece'), ('chevron-circle-down', 'circle-chevron-down'), ('chevron-circle-left', 'circle-chevron-left'), ('chevron-circle-right', 'circle-chevron-right'), ('chevron-circle-up', 'circle-chevron-up'), ('chevron-double-down', 'chevrons-down'), ('chevron-double-left', 'chevrons-left'), ('chevron-double-right', 'chevrons-right'), ('chevron-double-up', 'chevrons-up'), ('chevron-square-down', 'square-chevron-down'), ('chevron-square-left', 'square-chevron-left'), ('chevron-square-right', 'square-chevron-right'), ('chevron-square-up', 'square-chevron-up'), ('clinic-medical', 'house-chimney-medical'), ('cloud-download', 'cloud-arrow-down'), ('cloud-download-alt', 'cloud-arrow-down'), ('cloud-upload', 'cloud-arrow-up'), ('cloud-upload-alt', 'cloud-arrow-up'), ('cocktail', 'martini-glass-citrus'), ('coffee', 'mug-saucer'), ('coffee-togo', 'cup-togo'), ('cog', 'gear'), ('cogs', 'gears'), ('columns', 'table-columns'), ('comment-alt', 'message'), ('comment-alt-check', 'message-check'), ('comment-alt-dollar', 'message-dollar'), ('comment-alt-dots', 'message-dots'), ('comment-alt-edit', 'message-pen'), ('comment-alt-exclamation', 'message-exclamation'), ('comment-alt-lines', 'message-lines'), ('comment-alt-medical', 'message-medical'), ('comment-alt-minus', 'message-minus'), ('comment-alt-music', 'message-music'), ('comment-alt-plus', 'message-plus'), ('comment-alt-slash', 'message-slash'), ('comment-alt-smile', 'message-smile'), ('comment-alt-times', 'message-xmark'), ('comment-edit', 'comment-pen'), ('comment-times', 'comment-xmark'), ('comments-alt', 'messages'), ('comments-alt-dollar', 'messages-dollar'), ('compress-alt', 'down-left-and-up-right-to-center'), ('compress-arrows-alt', 'minimize'), ('concierge-bell', 'bell-concierge'), ('construction', 'triangle-person-digging'), ('conveyor-belt-alt', 'conveyor-belt-boxes'), ('cowbell-more', 'cowbell-circle-plus'), ('cricket', 'cricket-bat-ball'), ('crop-alt', 'crop-simple'), ('curling', 'curling-stone'), ('cut', 'scissors'), ('deaf', 'ear-deaf'), ('debug', 'ban-bug'), ('desktop-alt', 'desktop'), ('dewpoint', 'droplet-degree'), ('diagnoses', 'person-dots-from-line'), ('digging', 'person-digging'), ('digital-tachograph', 'tachograph-digital'), ('directions', 'diamond-turn-right'), ('dizzy', 'face-dizzy'), ('dolly-flatbed', 'cart-flatbed'), ('dolly-flatbed-alt', 'cart-flatbed-boxes'), ('dolly-flatbed-empty', 'cart-flatbed-empty'), ('donate'('', 'circle-dollar-to-slot'), ('dot-circle', 'circle-dot'), ('drafting-compass', 'compass-drafting'), ('drone-alt', 'drone-front'), ('dryer-alt', 'dryer-heat'), ('eclipse-alt', 'moon-over-sun'), ('edit', 'pen-to-square'), ('ellipsis-h', 'ellipsis'), ('ellipsis-h-alt', 'ellipsis-stroke'), ('ellipsis-v', 'ellipsis-vertical'), ('ellipsis-v-alt', 'ellipsis-stroke-vertical'), ('envelope-square', 'square-envelope'), ('exchange', 'arrow-right-arrow-left'), ('exchange-alt', 'right-left'), ('exclamation-circle', 'circle-exclamation'), ('exclamation-square', 'square-exclamation'), ('exclamation-triangle', 'triangle-exclamation'), ('expand-alt', 'up-right-and-down-left-from-center'), ('expand-arrows', 'arrows-maximize'), ('expand-arrows-alt', 'maximize'), ('external-link', 'arrow-up-right-from-square'), ('external-link-alt', 'up-right-from-square'), ('external-link-square', 'square-arrow-up-right'), ('external-link-square-alt', 'square-up-right'), ('eyedropper', 'eye-dropper'), ('fast-backward', 'backward-fast'), ('fast-forward', 'forward-fast'), ('feather-alt', 'feather-pointed'), ('female', 'person-dress'), ('field-hockey', 'field-hockey-stick-ball'), ('fighter-jet', 'jet-fighter'), ('file-alt', 'file-lines'), ('file-archive', 'file-zipper'), ('file-chart-line', 'file-chart-column'), ('file-download', 'file-arrow-down'), ('file-edit', 'file-pen'), ('file-medical-alt', 'file-waveform'), ('file-search', 'file-magnifying-glass'), ('file-times', 'file-xmark'), ('file-upload', 'file-arrow-up'), ('film-alt', 'film-simple'), ('fire-alt', 'fire-flame-curved'), ('first-aid', 'kit-medical'), ('fist-raised', 'hand-fist'), ('flag-alt', 'flag-swallowtail'), ('flame', 'fire-flame'), ('flask-poison', 'flask-round-poison'), ('flask-potion', 'flask-round-potion'), ('flushed', 'face-flushed'), ('fog', 'cloud-fog'), ('folder-download', 'folder-arrow-down'), ('folder-times', 'folder-xmark'), ('folder-upload', 'folder-arrow-up'), ('font-awesome-alt', 'square-font-awesome-stroke'), ('font-awesome-flag', 'font-awesome'), ('font-awesome-logo-full', 'font-awesome'), ('football-ball', 'football'), ('fragile', 'wine-glass-crack'), ('frosty-head', 'snowman-head'), ('frown', 'face-frown'), ('frown-open', 'face-frown-open'), ('funnel-dollar', 'filter-circle-dollar'), ('game-board-alt', 'game-board-simple'), ('gamepad-alt', 'gamepad-modern'), ('glass-champagne', 'champagne-glass'), ('glass-cheers', 'champagne-glasses'), ('glass-martini', 'martini-glass-empty'), ('glass-martini-alt', 'martini-glass'), ('glass-whiskey', 'whiskey-glass'), ('glass-whiskey-rocks', 'whiskey-glass-ice'), ('glasses-alt', 'glasses-round'), ('globe-africa', 'earth-africa'), ('globe-americas', 'earth-americas'), ('globe-asia', 'earth-asia'), ('globe-europe', 'earth-europe'), ('golf-ball', 'golf-ball-tee'), ('grimace', 'face-grimace'), ('grin', 'face-grin'), ('grin-alt', 'face-grin-wide'), ('grin-beam', 'face-grin-beam'), ('grin-beam-sweat', 'face-grin-beam-sweat'), ('grin-hearts', 'face-grin-hearts'), ('grin-squint', 'face-grin-squint'), ('grin-squint-tears', 'face-grin-squint-tears'), ('grin-stars', 'face-grin-stars'), ('grin-tears', 'face-grin-tears'), ('grin-tongue', 'face-grin-tongue'), ('grin-tongue-squint', 'face-grin-tongue-squint'), ('grin-tongue-wink', 'face-grin-tongue-wink'), ('grin-wink', 'face-grin-wink'), ('grip-horizontal', 'grip'), ('h-square', 'square-h'), ('hamburger', 'burger'), ('hand-holding-usd', 'hand-holding-dollar'), ('hand-holding-water', 'hand-holding-droplet'), ('hand-paper', 'hand'), ('hand-receiving', 'hands-holding-diamond'), ('hand-rock', 'hand-back-fist'), ('hands-heart', 'hands-holding-heart'), ('hands-helping', 'handshake-angle'), ('hands-usd', 'hands-holding-dollar'), ('hands-wash', 'hands-bubbles'), ('handshake-alt', 'handshake-simple'), ('handshake-alt-slash', 'handshake-simple-slash'), ('hard-hat', 'helmet-safety'), ('hdd', 'hard-drive'), ('head-vr', 'head-side-goggles'), ('headphones-alt', 'headphones-simple'), ('heart-broken', 'heart-crack'), ('heart-circle', 'circle-heart'), ('heart-rate', 'wave-pulse'), ('heart-square', 'square-heart'), ('heartbeat', 'heart-pulse'), ('hiking', 'person-hiking'), ('history', 'clock-rotate-left'), ('home', 'house'), ('home-alt', 'house'), ('home-heart', 'house-heart'), ('home-lg', 'house-chimney'), ('home-lg-alt', 'house'), ('hospital-alt', 'hospital'), ('hospital-symbol', 'circle-h'), ('hot-tub', 'hot-tub-person'), ('hourglass-half', 'hourglass'), ('house-damage', 'house-chimney-crack'), ('house-leave', 'house-person-leave'), ('house-return', 'house-person-return'), ('hryvnia', 'hryvnia-sign'), ('humidity', 'droplet-percent'), ('icons-alt', 'symbols'), ('id-card-alt', 'id-card-clip'), ('industry-alt', 'industry-windows'), ('info-circle', 'circle-info'), ('info-square', 'square-info'), ('innosoft', '42-group'), ('inventory', 'shelves'), ('journal-whills', 'book-journal-whills'), ('kiss', 'face-kiss'), ('kiss-beam', 'face-kiss-beam'), ('kiss-wink-heart', 'face-kiss-wink-heart'), ('landmark-alt', 'landmark-dome'), ('laptop-house', 'house-laptop'), ('laugh', 'face-laugh'), ('laugh-beam', 'face-laugh-beam'), ('laugh-squint', 'face-laugh-squint'), ('laugh-wink', 'face-laugh-wink'), ('level-down', 'arrow-turn-down'), ('level-down-alt', 'turn-down'), ('level-up', 'arrow-turn-up'), ('level-up-alt', 'turn-up'), ('list-alt', 'rectangle-list'), ('location', 'location-crosshairs'), ('location-circle', 'circle-location-arrow'), ('location-slash', 'location-crosshairs-slash'), ('lock-alt', 'lock-keyhole'), ('lock-open-alt', 'lock-keyhole-open'), ('long-arrow-alt-down', 'down-long'), ('long-arrow-alt-left', 'left-long'), ('long-arrow-alt-right', 'right-long'), ('long-arrow-alt-up', 'up-long'), ('long-arrow-down', 'arrow-down-long'), ('long-arrow-left', 'arrow-left-long'), ('long-arrow-right', 'arrow-right-long'), ('long-arrow-up', 'arrow-up-long'), ('low-vision', 'eye-low-vision'), ('luchador', 'luchador-mask'), ('luggage-cart', 'cart-flatbed-suitcase'), ('magic', 'wand-magic'), ('mail-bulk', 'envelopes-bulk'), ('male', 'person'), ('map-marked', 'map-location'), ('map-marked-alt', 'map-location-dot'), ('map-marker', 'location-pin'), ('map-marker-alt', 'location-dot'), ('map-marker-alt-slash', 'location-dot-slash'), ('map-marker-check', 'location-check'), ('map-marker-edit', 'location-pen'), ('map-marker-exclamation', 'location-exclamation'), ('map-marker-minus', 'location-minus'), ('map-marker-plus', 'location-plus'), ('map-marker-question', 'location-question'), ('map-marker-slash', 'location-pin-slash'), ('map-marker-smile', 'location-smile'), ('map-marker-times', 'location-xmark'), ('map-signs', 'signs-post'), ('mars-stroke-h', 'mars-stroke-right'), ('mars-stroke-v', 'mars-stroke-up'), ('medium-m', 'medium'), ('medkit', 'suitcase-medical'), ('meh', 'face-meh'), ('meh-blank', 'face-meh-blank'), ('meh-rolling-eyes', 'face-rolling-eyes'), ('microphone-alt', 'microphone-lines'), ('microphone-alt-slash', 'microphone-lines-slash'), ('mind-share', 'brain-arrow-curved-right'), ('minus-circle', 'circle-minus'), ('minus-hexagon', 'hexagon-minus'), ('minus-octagon', 'octagon-minus'), ('minus-square', 'square-minus'), ('mobile-alt', 'mobile-screen-button'), ('mobile-android', 'mobile'), ('mobile-android-alt', 'mobile-screen'), ('money-bill-alt', 'money-bill-1'), ('money-bill-wave-alt', 'money-bill-1-wave'), ('money-check-alt', 'money-check-dollar'), ('money-check-edit', 'money-check-pen'), ('money-check-edit-alt', 'money-check-dollar-pen'), ('monitor-heart-rate', 'monitor-waveform'), ('mouse', 'computer-mouse'), ('mouse-alt', 'computer-mouse-scrollwheel'), ('mouse-pointer', 'arrow-pointer'), ('music-alt', 'music-note'), ('music-alt-slash', 'music-note-slash'), ('oil-temp', 'oil-temperature'), ('page-break', 'file-dashed-line'), ('paint-brush', 'paintbrush'), ('paint-brush-alt', 'paintbrush-fine'), ('paint-brush-fine', 'paintbrush-fine'), ('pallet-alt', 'pallet-boxes'), ('paragraph-rtl', 'paragraph-left'), ('parking', 'square-parking'), ('parking-circle', 'circle-parking'), ('parking-circle-slash', 'ban-parking'), ('parking-slash', 'square-parking-slash'), ('pastafarianism', 'spaghetti-monster-flying'), ('pause-circle', 'circle-pause'), ('paw-alt', 'paw-simple'), ('pen-alt', 'pen-clip'), ('pen-square', 'square-pen'), ('pencil-alt', 'pencil'), ('pencil-paintbrush', 'pen-paintbrush'), ('pencil-ruler', 'pen-ruler'), ('pennant', 'flag-pennant'), ('people-arrows', 'people-arrows-left-right'), ('people-carry', 'people-carry-box'), ('percentage', 'percent'), ('person-carry', 'person-carry-box'), ('phone-alt', 'phone-flip'), ('phone-laptop', 'laptop-mobile'), ('phone-square', 'square-phone'), ('phone-square-alt', 'square-phone-flip'), ('photo-video', 'photo-film'), ('plane-alt', 'plane-engines'), ('play-circle', 'circle-play'), ('plus-circle', 'circle-plus'), ('plus-hexagon', 'hexagon-plus'), ('plus-octagon', 'octagon-plus'), ('plus-square', 'square-plus'), ('poll', 'square-poll-vertical'), ('poll-h', 'square-poll-horizontal'), ('portal-enter', 'person-to-portal'), ('portal-exit', 'person-from-portal'), ('portrait', 'image-portrait'), ('pound-sign', 'sterling-sign'), ('pray', 'person-praying'), ('praying-hands', 'hands-praying'), ('prescription-bottle-alt', 'prescription-bottle-medical'), ('presentation', 'presentation-screen'), ('print-search', 'print-magnifying-glass'), ('procedures', 'bed-pulse'), ('project-diagram', 'diagram-project'), ('question-circle', 'circle-question'), ('question-square', 'square-question'), ('quran', 'book-quran'), ('rabbit-fast', 'rabbit-running'), ('radiation-alt', 'circle-radiation'), ('radio-alt', 'radio-tuner'), ('random', 'shuffle'), ('rectangle-landscape', 'rectangle'), ('rectangle-portrait', 'rectangle-vertical'), ('redo', 'arrow-rotate-right'), ('redo-alt', 'rotate-right'), ('remove-format', 'text-slash'), ('repeat-1-alt', 'arrows-repeat-1'), ('repeat-alt', 'arrows-repeat'), ('retweet-alt', 'arrows-retweet'), ('rss-square', 'square-rss'), ('running', 'person-running'), ('sad-cry', 'face-sad-cry'), ('sad-tear', 'face-sad-tear'), ('save', 'floppy-disk'), ('sax-hot', 'saxophone-fire'), ('scalpel-path', 'scalpel-line-dashed'), ('scanner-image', 'scanner'), ('search', 'magnifying-glass'), ('search-dollar', 'magnifying-glass-dollar'), ('search-location', 'magnifying-glass-location'), ('search-minus', 'magnifying-glass-minus'), ('search-plus', 'magnifying-glass-plus'), ('sensor-alert', 'sensor-triangle-exclamation'), ('sensor-smoke', 'sensor-cloud'), ('share-alt', 'share-nodes'), ('share-alt-square', 'square-share-nodes'), ('share-square', 'share-from-square'), ('shield-alt', 'shield-halved'), ('shipping-fast', 'truck-fast'), ('shipping-timed', 'truck-clock'), ('shopping-bag', 'bag-shopping'), ('shopping-basket', 'basket-shopping'), ('shopping-cart', 'cart-shopping'), ('shuttle-van', 'van-shuttle'), ('sign', 'sign-hanging'), ('sign-in', 'arrow-right-to-bracket'), ('sign-in-alt', 'right-to-bracket'), ('sign-language', 'hands'), ('sign-out', 'arrow-right-from-bracket'), ('sign-out-alt', 'right-from-bracket'), ('signal-1', 'signal-weak'), ('signal-2', 'signal-fair'), ('signal-3', 'signal-good'), ('signal-4', 'signal-strong'), ('signal-alt', 'signal-bars'), ('signal-alt-1', 'signal-bars-weak'), ('signal-alt-2', 'signal-bars-fair'), ('signal-alt-3', 'signal-bars-good'), ('signal-alt-slash', 'signal-bars-slash'), ('skating', 'person-skating'), ('ski-jump', 'person-ski-jumping'), ('ski-lift', 'person-ski-lift'), ('skiing', 'person-skiing'), ('skiing-nordic', 'person-skiing-nordic'), ('slack-hash', 'slack'), ('sledding', 'person-sledding'), ('sliders-h', 'sliders'), ('sliders-h-square', 'square-sliders'), ('sliders-v', 'sliders-up'), ('sliders-v-square', 'square-sliders-vertical'), ('smile', 'face-smile'), ('smile-beam', 'face-smile-beam'), ('smile-plus', 'face-smile-plus'), ('smile-wink', 'face-smile-wink'), ('smoking-ban', 'ban-smoking'), ('sms', 'comment-sms'), ('snapchat-ghost', 'snapchat'), ('snowboarding', 'person-snowboarding'), ('snowmobile', 'person-snowmobiling'), ('sort-alpha-down', 'arrow-down-a-z'), ('sort-alpha-down-alt', 'arrow-down-z-a'), ('sort-alpha-up', 'arrow-up-a-z'), ('sort-alpha-up-alt', 'arrow-up-z-a'), ('sort-alt', 'arrow-down-arrow-up'), ('sort-amount-down', 'arrow-down-wide-short'), ('sort-amount-down-alt', 'arrow-down-short-wide'), ('sort-amount-up', 'arrow-up-wide-short'), ('sort-amount-up-alt', 'arrow-up-short-wide'), ('sort-circle', 'circle-sort'), ('sort-circle-down', 'circle-sort-down'), ('sort-circle-up', 'circle-sort-up'), ('sort-numeric-down', 'arrow-down-1-9'), ('sort-numeric-down-alt', 'arrow-down-9-1'), ('sort-numeric-up', 'arrow-up-1-9'), ('sort-numeric-up-alt', 'arrow-up-9-1'), ('sort-shapes-down', 'arrow-down-triangle-square'), ('sort-shapes-down-alt', 'arrow-down-square-triangle'), ('sort-shapes-up', 'arrow-up-triangle-square'), ('sort-shapes-up-alt', 'arrow-up-square-triangle'), ('sort-size-down', 'arrow-down-big-small'), ('sort-size-down-alt', 'arrow-down-small-big'), ('sort-size-up', 'arrow-up-big-small'), ('sort-size-up-alt', 'arrow-up-small-big'), ('soup', 'bowl-hot'), ('space-shuttle', 'shuttle-space'), ('space-station-moon-alt', 'space-station-moon-construction'), ('square-root-alt', 'square-root-variable'), ('star-half-alt', 'star-half-stroke'), ('starfighter-alt', 'starfighter-twin-ion-engine'), ('step-backward', 'backward-step'), ('step-forward', 'forward-step'), ('sticky-note', 'note-sticky'), ('stop-circle', 'circle-stop'), ('store-alt', 'shop'), ('store-alt-slash', 'shop-slash'), ('stream', 'bars-staggered'), ('subway', 'train-subway'), ('surprise', 'face-surprise'), ('swimmer', 'person-swimming'), ('swimming-pool', 'water-ladder'), ('sync', 'arrows-rotate'), ('sync-alt', 'rotate'), ('table-tennis', 'table-tennis-paddle-ball'), ('tablet-alt', 'tablet-screen-button'), ('tablet-android', 'tablet'), ('tablet-android-alt', 'tablet-screen'), ('tachometer', 'gauge-simple'), ('tachometer-alt', 'gauge'), ('tachometer-alt-average', 'gauge-med'), ('tachometer-alt-fast', 'gauge'), ('tachometer-alt-fastest', 'gauge-max'), ('tachometer-alt-slow', 'gauge-low'), ('tachometer-alt-slowest', 'gauge-min'), ('tachometer-average', 'gauge-simple-med'), ('tachometer-fast', 'gauge-simple'), ('tachometer-fastest', 'gauge-simple-max'), ('tachometer-slow', 'gauge-simple-low'), ('tachometer-slowest', 'gauge-simple-min'), ('tanakh', 'book-tanakh'), ('tasks', 'list-check'), ('tasks-alt', 'bars-progress'), ('telegram-plane', 'telegram'), ('temperature-down', 'temperature-arrow-down'), ('temperature-frigid', 'temperature-snow'), ('temperature-hot', 'temperature-sun'), ('temperature-up', 'temperature-arrow-up'), ('tenge', 'tenge-sign'), ('th', 'table-cells'), ('th-large', 'table-cells-large'), ('th-list', 'table-list'), ('theater-masks', 'masks-theater'), ('thermometer-empty', 'temperature-empty'), ('thermometer-full', 'temperature-full'), ('thermometer-half', 'temperature-half'), ('thermometer-quarter', 'temperature-quarter'), ('thermometer-three-quarters', 'temperature-three-quarters'), ('thumb-tack', 'thumbtack'), ('thunderstorm', 'cloud-bolt'), ('thunderstorm-moon', 'cloud-bolt-moon'), ('thunderstorm-sun', 'cloud-bolt-sun'), ('ticket-alt', 'ticket-simple'), ('times', 'xmark'), ('times-circle', 'circle-xmark'), ('times-hexagon', 'hexagon-xmark'), ('times-octagon', 'octagon-xmark'), ('times-square', 'square-xmark'), ('tint', 'droplet'), ('tint-slash', 'droplet-slash'), ('tired', 'face-tired'), ('toilet-paper-alt', 'toilet-paper-blank'), ('tombstone-alt', 'tombstone-blank'), ('tools', 'screwdriver-wrench'), ('torah', 'scroll-torah'), ('tram', 'train-tram'), ('transgender-alt', 'transgender'), ('trash-alt', 'trash-can'), ('trash-restore', 'trash-arrow-up'), ('trash-restore-alt', 'trash-can-arrow-up'), ('trash-undo-alt', 'trash-can-undo'), ('tree-alt', 'tree-deciduous'), ('triangle-music', 'triangle-instrument'), ('trophy-alt', 'trophy-star'), ('truck-couch', 'truck-ramp-couch'), ('truck-loading', 'truck-ramp-box'), ('tshirt', 'shirt'), ('tv-alt', 'tv'), ('undo', 'arrow-rotate-left'), ('undo-alt', 'rotate-left'), ('university', 'building-columns'), ('unlink', 'link-slash'), ('unlock-alt', 'unlock-keyhole'), ('usd-circle', 'circle-dollar'), ('usd-square', 'square-dollar'), ('user-alt', 'user-large'), ('user-alt-slash', 'user-large-slash'), ('user-chart', 'chart-user'), ('user-circle', 'circle-user'), ('user-cog', 'user-gear'), ('user-edit', 'user-pen'), ('user-friends', 'user-group'), ('user-hard-hat', 'user-helmet-safety'), ('user-md', 'user-doctor'), ('user-md-chat', 'user-doctor-message'), ('user-times', 'user-xmark'), ('users-class', 'screen-users'), ('users-cog', 'users-gear'), ('users-crown', 'user-group-crown'), ('utensil-fork', 'fork'), ('utensil-knife', 'knife'), ('utensil-spoon', 'spoon'), ('utensils-alt', 'fork-knife'), ('vhs', 'cassette-vhs'), ('volleyball-ball', 'volleyball'), ('volume-down', 'volume-low'), ('volume-mute', 'volume-xmark'), ('volume-up', 'volume-high'), ('vote-nay', 'xmark-to-slot'), ('vote-yea', 'check-to-slot'), ('walking', 'person-walking'), ('warehouse-alt', 'warehouse-full'), ('washer', 'washing-machine'), ('water-lower', 'water-arrow-down'), ('water-rise', 'water-arrow-up'), ('waveform-path', 'waveform-lines'), ('webcam', 'camera-web'), ('webcam-slash', 'camera-web-slash'), ('weight', 'weight-scale'), ('wifi-1', 'wifi-weak'), ('wifi-2', 'wifi-fair'), ('window-alt', 'window-flip'), ('window-close', 'rectangle-xmark'), ('wine-glass-alt', 'wine-glass-empty')) AS mapping(from_icon, to_icon)\n)\nUPDATE sidebar_urls\nSET icon =\n  CASE\n    WHEN icon LIKE 'fab-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far-%' THEN CONCAT('far-', remaps.to_icon)\n    WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', remaps.to_icon)\n    ELSE remaps.to_icon\n  END\nFROM remaps\nWHERE icon = remaps.from_icon\n  OR icon = CONCAT('fa-', remaps.from_icon)\n  OR icon = CONCAT('far-', remaps.from_icon)\n  OR icon = CONCAT('fab-', remaps.from_icon)\n  OR icon = CONCAT('far fa-', remaps.from_icon)\n  OR icon = CONCAT('fab fa-', remaps.from_icon)\n  OR icon = CONCAT('fas fa-', remaps.from_icon);\n")
   -> 0.0075s
-- execute("UPDATE sidebar_urls\nSET icon =\nCASE\n  WHEN icon LIKE 'fas fa-%' THEN SUBSTRING(icon FROM 8)\n  WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fa-%' THEN SUBSTRING(icon FROM 4)\n  ELSE icon\nEND\nWHERE icon LIKE 'fa-%'\n  OR icon LIKE 'far fa-%'\n  OR icon LIKE 'fab fa-%'\n  OR icon LIKE 'fas fa-%';\n")
   -> 0.0003s
-- execute("WITH remaps AS (\n  SELECT from_icon, to_icon FROM (VALUES ('adjust', 'circle-half-stroke'), ('air-freshener', 'spray-can-sparkles'), ('alien-monster', 'alien-8bit'), ('allergies', 'hand-dots'), ('ambulance', 'truck-medical'), ('american-sign-language-interpreting', 'hands-asl-interpreting'), ('analytics', 'chart-mixed'), ('angle-double-down', 'angles-down'), ('angle-double-left', 'angles-left'), ('angle-double-right', 'angles-right'), ('angle-double-up', 'angles-up'), ('angry', 'face-angry'), ('apple-alt', 'apple-whole'), ('apple-crate', 'crate-apple'), ('archive', 'box-archive'), ('arrow-alt-circle-down', 'circle-down'), ('arrow-alt-circle-left', 'circle-left'), ('arrow-alt-circle-right', 'circle-right'), ('arrow-alt-circle-up', 'circle-up'), ('arrow-alt-down', 'down'), ('arrow-alt-from-bottom', 'up-from-line'), ('arrow-alt-from-left', 'right-from-line'), ('arrow-alt-from-right', 'left-from-line'), ('arrow-alt-from-top', 'down-from-line'), ('arrow-alt-left', 'left'), ('arrow-alt-right', 'right'), ('arrow-alt-square-down', 'square-down'), ('arrow-alt-square-left', 'square-left'), ('arrow-alt-square-right', 'square-right'), ('arrow-alt-square-up', 'square-up'), ('arrow-alt-to-bottom', 'down-to-line'), ('arrow-alt-to-left', 'left-to-line'), ('arrow-alt-to-right', 'right-to-line'), ('arrow-alt-to-top', 'up-to-line'), ('arrow-alt-up', 'up'), ('arrow-circle-down', 'circle-arrow-down'), ('arrow-circle-left', 'circle-arrow-left'), ('arrow-circle-right', 'circle-arrow-right'), ('arrow-circle-up', 'circle-arrow-up'), ('arrow-from-bottom', 'arrow-up-from-line'), ('arrow-from-left', 'arrow-right-from-line'), ('arrow-from-right', 'arrow-left-from-line'), ('arrow-from-top', 'arrow-down-from-line'), ('arrow-square-down', 'square-arrow-down'), ('arrow-square-left', 'square-arrow-left'), ('arrow-square-right', 'square-arrow-right'), ('arrow-square-up', 'square-arrow-up'), ('arrow-to-bottom', 'arrow-down-to-line'), ('arrow-to-left', 'arrow-left-to-line'), ('arrow-to-right', 'arrow-right-to-line'), ('arrow-to-top', 'arrow-up-to-line'), ('arrows', 'arrows-up-down-left-right'), ('arrows-alt', 'up-down-left-right'), ('arrows-alt-h', 'left-right'), ('arrows-alt-v', 'up-down'), ('arrows-h', 'arrows-left-right'), ('arrows-v', 'arrows-up-down'), ('assistive-listening-systems', 'ear-listen'), ('atlas', 'book-atlas'), ('atom-alt', 'atom-simple'), ('backspace', 'delete-left'), ('balance-scale', 'scale-balanced'), ('balance-scale-left', 'scale-unbalanced'), ('balance-scale-right', 'scale-unbalanced-flip'), ('band-aid', 'bandage'), ('barcode-alt', 'rectangle-barcode'), ('baseball-ball', 'baseball'), ('basketball-ball', 'basketball'), ('bed-alt', 'bed-front'), ('beer', 'beer-mug-empty'), ('betamax', 'cassette-betamax'), ('bible', 'book-bible'), ('biking', 'person-biking'), ('biking-mountain', 'person-biking-mountain'), ('birthday-cake', 'cake-candles'), ('blind', 'person-walking-with-cane'), ('book-alt', 'book-blank'), ('book-dead', 'book-skull'), ('book-reader', 'book-open-reader'), ('book-spells', 'book-sparkles'), ('border-style', 'border-top-left'), ('border-style-alt', 'border-bottom-right'), ('box-alt', 'box-taped'), ('box-fragile', 'square-fragile'), ('box-full', 'box-open-full'), ('box-up', 'square-this-way-up'), ('box-usd', 'box-dollar'), ('boxes', 'boxes-stacked'), ('boxes-alt', 'boxes-stacked'), ('brackets', 'brackets-square'), ('broadcast-tower', 'tower-broadcast'), ('burn', 'fire-flame-simple'), ('bus-alt', 'bus-simple'), ('calculator-alt', 'calculator-simple'), ('calendar-alt', 'calendar-days'), ('calendar-edit', 'calendar-pen'), ('calendar-times', 'calendar-xmark'), ('camera-alt', 'camera'), ('camera-home', 'camera-security'), ('car-alt', 'car-rear'), ('car-crash', 'car-burst'), ('car-mechanic', 'car-wrench'), ('caravan-alt', 'caravan-simple'), ('caret-circle-down', 'circle-caret-down'), ('caret-circle-left', 'circle-caret-left'), ('caret-circle-right', 'circle-caret-right'), ('caret-circle-up', 'circle-caret-up'), ('caret-square-down', 'square-caret-down'), ('caret-square-left', 'square-caret-left'), ('caret-square-right', 'square-caret-right'), ('caret-square-up', 'square-caret-up'), ('cctv', 'camera-cctv'), ('chalkboard-teacher', 'chalkboard-user'), ('chart-pie-alt', 'chart-pie-simple'), ('check-circle', 'circle-check'), ('check-square', 'square-check'), ('cheeseburger', 'burger-cheese'), ('chess-bishop-alt', 'chess-bishop-piece'), ('chess-clock-alt', 'chess-clock-flip'), ('chess-king-alt', 'chess-king-piece'), ('chess-knight-alt', 'chess-knight-piece'), ('chess-pawn-alt', 'chess-pawn-piece'), ('chess-queen-alt', 'chess-queen-piece'), ('chess-rook-alt', 'chess-rook-piece'), ('chevron-circle-down', 'circle-chevron-down'), ('chevron-circle-left', 'circle-chevron-left'), ('chevron-circle-right', 'circle-chevron-right'), ('chevron-circle-up', 'circle-chevron-up'), ('chevron-double-down', 'chevrons-down'), ('chevron-double-left', 'chevrons-left'), ('chevron-double-right', 'chevrons-right'), ('chevron-double-up', 'chevrons-up'), ('chevron-square-down', 'square-chevron-down'), ('chevron-square-left', 'square-chevron-left'), ('chevron-square-right', 'square-chevron-right'), ('chevron-square-up', 'square-chevron-up'), ('clinic-medical', 'house-chimney-medical'), ('cloud-download', 'cloud-arrow-down'), ('cloud-download-alt', 'cloud-arrow-down'), ('cloud-upload', 'cloud-arrow-up'), ('cloud-upload-alt', 'cloud-arrow-up'), ('cocktail', 'martini-glass-citrus'), ('coffee', 'mug-saucer'), ('coffee-togo', 'cup-togo'), ('cog', 'gear'), ('cogs', 'gears'), ('columns', 'table-columns'), ('comment-alt', 'message'), ('comment-alt-check', 'message-check'), ('comment-alt-dollar', 'message-dollar'), ('comment-alt-dots', 'message-dots'), ('comment-alt-edit', 'message-pen'), ('comment-alt-exclamation', 'message-exclamation'), ('comment-alt-lines', 'message-lines'), ('comment-alt-medical', 'message-medical'), ('comment-alt-minus', 'message-minus'), ('comment-alt-music', 'message-music'), ('comment-alt-plus', 'message-plus'), ('comment-alt-slash', 'message-slash'), ('comment-alt-smile', 'message-smile'), ('comment-alt-times', 'message-xmark'), ('comment-edit', 'comment-pen'), ('comment-times', 'comment-xmark'), ('comments-alt', 'messages'), ('comments-alt-dollar', 'messages-dollar'), ('compress-alt', 'down-left-and-up-right-to-center'), ('compress-arrows-alt', 'minimize'), ('concierge-bell', 'bell-concierge'), ('construction', 'triangle-person-digging'), ('conveyor-belt-alt', 'conveyor-belt-boxes'), ('cowbell-more', 'cowbell-circle-plus'), ('cricket', 'cricket-bat-ball'), ('crop-alt', 'crop-simple'), ('curling', 'curling-stone'), ('cut', 'scissors'), ('deaf', 'ear-deaf'), ('debug', 'ban-bug'), ('desktop-alt', 'desktop'), ('dewpoint', 'droplet-degree'), ('diagnoses', 'person-dots-from-line'), ('digging', 'person-digging'), ('digital-tachograph', 'tachograph-digital'), ('directions', 'diamond-turn-right'), ('dizzy', 'face-dizzy'), ('dolly-flatbed', 'cart-flatbed'), ('dolly-flatbed-alt', 'cart-flatbed-boxes'), ('dolly-flatbed-empty', 'cart-flatbed-empty'), ('donate', 'circle-dollar-to-slot'), ('dot-circle', 'circle-dot'), ('drafting-compass', 'compass-drafting'), ('drone-alt', 'drone-front'), ('dryer-alt', 'dryer-heat'), ('eclipse-alt', 'moon-over-sun'), ('edit', 'pen-to-square'), ('ellipsis-h', 'ellipsis'), ('ellipsis-h-alt', 'ellipsis-stroke'), ('ellipsis-v', 'ellipsis-vertical'), ('ellipsis-v-alt', 'ellipsis-stroke-vertical'), ('envelope-square', 'square-envelope'), ('exchange', 'arrow-right-arrow-left'), ('exchange-alt', 'right-left'), ('exclamation-circle', 'circle-exclamation'), ('exclamation-square', 'square-exclamation'), ('exclamation-triangle', 'triangle-exclamation'), ('expand-alt', 'up-right-and-down-left-from-center'), ('expand-arrows', 'arrows-maximize'), ('expand-arrows-alt', 'maximize'), ('external-link', 'arrow-up-right-from-square'), ('external-link-alt', 'up-right-from-square'), ('external-link-square', 'square-arrow-up-right'), ('external-link-square-alt', 'square-up-right'), ('eyedropper', 'eye-dropper'), ('fast-backward', 'backward-fast'), ('fast-forward', 'forward-fast'), ('feather-alt', 'feather-pointed'), ('female', 'person-dress'), ('field-hockey', 'field-hockey-stick-ball'), ('fighter-jet', 'jet-fighter'), ('file-alt', 'file-lines'), ('file-archive', 'file-zipper'), ('file-chart-line', 'file-chart-column'), ('file-download', 'file-arrow-down'), ('file-edit', 'file-pen'), ('file-medical-alt', 'file-waveform'), ('file-search', 'file-magnifying-glass'), ('file-times', 'file-xmark'), ('file-upload', 'file-arrow-up'), ('film-alt', 'film-simple'), ('fire-alt', 'fire-flame-curved'), ('first-aid', 'kit-medical'), ('fist-raised', 'hand-fist'), ('flag-alt', 'flag-swallowtail'), ('flame', 'fire-flame'), ('flask-poison', 'flask-round-poison'), ('flask-potion', 'flask-round-potion'), ('flushed', 'face-flushed'), ('fog', 'cloud-fog'), ('folder-download', 'folder-arrow-down'), ('folder-times', 'folder-xmark'), ('folder-upload', 'folder-arrow-up'), ('font-awesome-alt', 'square-font-awesome-stroke'), ('font-awesome-flag', 'font-awesome'), ('font-awesome-logo-full', 'font-awesome'), ('football-ball', 'football'), ('fragile', 'wine-glass-crack'), ('frosty-head', 'snowman-head'), ('frown', 'face-frown'), ('frown-open', 'face-frown-open'), ('funnel-dollar', 'filter-circle-dollar'), ('game-board-alt', 'game-board-simple'), ('gamepad-alt', 'gamepad-modern'), ('glass-champagne', 'champagne-glass'), ('glass-cheers', 'champagne-glasses'), ('glass-martini', 'martini-glass-empty'), ('glass-martini-alt', 'martini-glass'), ('glass-whiskey', 'whiskey-glass'), ('glass-whiskey-rocks', 'whiskey-glass-ice'), ('glasses-alt', 'glasses-round'), ('globe-africa', 'earth-africa'), ('globe-americas', 'earth-americas'), ('globe-asia', 'earth-asia'), ('globe-europe', 'earth-europe'), ('golf-ball', 'golf-ball-tee'), ('grimace', 'face-grimace'), ('grin', 'face-grin'), ('grin-alt', 'face-grin-wide'), ('grin-beam', 'face-grin-beam'), ('grin-beam-sweat', 'face-grin-beam-sweat'), ('grin-hearts', 'face-grin-hearts'), ('grin-squint', 'face-grin-squint'), ('grin-squint-tears', 'face-grin-squint-tears'), ('grin-stars', 'face-grin-stars'), ('grin-tears', 'face-grin-tears'), ('grin-tongue', 'face-grin-tongue'), ('grin-tongue-squint', 'face-grin-tongue-squint'), ('grin-tongue-wink', 'face-grin-tongue-wink'), ('grin-wink', 'face-grin-wink'), ('grip-horizontal', 'grip'), ('h-square', 'square-h'), ('hamburger', 'burger'), ('hand-holding-usd', 'hand-holding-dollar'), ('hand-holding-water', 'hand-holding-droplet'), ('hand-paper', 'hand'), ('hand-receiving', 'hands-holding-diamond'), ('hand-rock', 'hand-back-fist'), ('hands-heart', 'hands-holding-heart'), ('hands-helping', 'handshake-angle'), ('hands-usd', 'hands-holding-dollar'), ('hands-wash', 'hands-bubbles'), ('handshake-alt', 'handshake-simple'), ('handshake-alt-slash', 'handshake-simple-slash'), ('hard-hat', 'helmet-safety'), ('hdd', 'hard-drive'), ('head-vr', 'head-side-goggles'), ('headphones-alt', 'headphones-simple'), ('heart-broken', 'heart-crack'), ('heart-circle', 'circle-heart'), ('heart-rate', 'wave-pulse'), ('heart-square', 'square-heart'), ('heartbeat', 'heart-pulse'), ('hiking', 'person-hiking'), ('history', 'clock-rotate-left'), ('home', 'house'), ('home-alt', 'house'), ('home-heart', 'house-heart'), ('home-lg', 'house-chimney'), ('home-lg-alt', 'house'), ('hospital-alt', 'hospital'), ('hospital-symbol', 'circle-h'), ('hot-tub', 'hot-tub-person'), ('hourglass-half', 'hourglass'), ('house-damage', 'house-chimney-crack'), ('house-leave', 'house-person-leave'), ('house-return', 'house-person-return'), ('hryvnia', 'hryvnia-sign'), ('humidity', 'droplet-percent'), ('icons-alt', 'symbols'), ('id-card-alt', 'id-card-clip'), ('industry-alt', 'industry-windows'), ('info-circle', 'circle-info'), ('info-square', 'square-info'), ('innosoft', '42-group'), ('inventory', 'shelves'), ('journal-whills', 'book-journal-whills'), ('kiss', 'face-kiss'), ('kiss-beam', 'face-kiss-beam'), ('kiss-wink-heart', 'face-kiss-wink-heart'), ('landmark-alt', 'landmark-dome'), ('laptop-house', 'house-laptop'), ('laugh', 'face-laugh'), ('laugh-beam', 'face-laugh-beam'), ('laugh-squint', 'face-laugh-squint'), ('laugh-wink', 'face-laugh-wink'), ('level-down', 'arrow-turn-down'), ('level-down-alt', 'turn-down'), ('level-up', 'arrow-turn-up'), ('level-up-alt', 'turn-up'), ('list-alt', 'rectangle-list'), ('location', 'location-crosshairs'), ('location-circle', 'circle-location-arrow'), ('location-slash', 'location-crosshairs-slash'), ('lock-alt', 'lock-keyhole'), ('lock-open-alt', 'lock-keyhole-open'), ('long-arrow-alt-down', 'down-long'), ('long-arrow-alt-left', 'left-long'), ('long-arrow-alt-right', 'right-long'), ('long-arrow-alt-up', 'up-long'), ('long-arrow-down', 'arrow-down-long'), ('long-arrow-left', 'arrow-left-long'), ('long-arrow-right', 'arrow-right-long'), ('long-arrow-up', 'arrow-up-long'), ('low-vision', 'eye-low-vision'), ('luchador', 'luchador-mask'), ('luggage-cart', 'cart-flatbed-suitcase'), ('magic', 'wand-magic'), ('mail-bulk', 'envelopes-bulk'), ('male', 'person'), ('map-marked', 'map-location'), ('map-marked-alt', 'map-location-dot'), ('map-marker', 'location-pin'), ('map-marker-alt', 'location-dot'), ('map-marker-alt-slash', 'location-dot-slash'), ('map-marker-check', 'location-check'), ('map-marker-edit', 'location-pen'), ('map-marker-exclamation', 'location-exclamation'), ('map-marker-minus', 'location-minus'), ('map-marker-plus', 'location-plus'), ('map-marker-question', 'location-question'), ('map-marker-slash', 'location-pin-slash'), ('map-marker-smile', 'location-smile'), ('map-marker-times', 'location-xmark'), ('map-signs', 'signs-post'), ('mars-stroke-h', 'mars-stroke-right'), ('mars-stroke-v', 'mars-stroke-up'), ('medium-m', 'medium'), ('medkit', 'suitcase-medical'), ('meh', 'face-meh'), ('meh-blank', 'face-meh-blank'), ('meh-rolling-eyes', 'face-rolling-eyes'), ('microphone-alt', 'microphone-lines'), ('microphone-alt-slash', 'microphone-lines-slash'), ('mind-share', 'brain-arrow-curved-right'), ('minus-circle', 'circle-minus'), ('minus-hexagon', 'hexagon-minus'), ('minus-octagon', 'octagon-minus'), ('minus-square', 'square-minus'), ('mobile-alt', 'mobile-screen-button'), ('mobile-android', 'mobile'), ('mobile-android-alt', 'mobile-screen'), ('money-bill-alt', 'money-bill-1'), ('money-bill-wave-alt', 'money-bill-1-wave'), ('money-check-alt', 'money-check-dollar'), ('money-check-edit', 'money-check-pen'), ('money-check-edit-alt', 'money-check-dollar-pen'), ('monitor-heart-rate', 'monitor-waveform'), ('mouse', 'computer-mouse'), ('mouse-alt', 'computer-mouse-scrollwheel'), ('mouse-pointer', 'arrow-pointer'), ('music-alt', 'music-note'), ('music-alt-slash', 'music-note-slash'), ('oil-temp', 'oil-temperature'), ('page-break', 'file-dashed-line'), ('paint-brush', 'paintbrush'), ('paint-brush-alt', 'paintbrush-fine'), ('paint-brush-fine', 'paintbrush-fine'), ('pallet-alt', 'pallet-boxes'), ('paragraph-rtl', 'paragraph-left'), ('parking', 'square-parking'), ('parking-circle', 'circle-parking'), ('parking-circle-slash', 'ban-parking'), ('parking-slash', 'square-parking-slash'), ('pastafarianism', 'spaghetti-monster-flying'), ('pause-circle', 'circle-pause'), ('paw-alt', 'paw-simple'), ('pen-alt', 'pen-clip'), ('pen-square', 'square-pen'), ('pencil-alt', 'pencil'), ('pencil-paintbrush', 'pen-paintbrush'), ('pencil-ruler', 'pen-ruler'), ('pennant', 'flag-pennant'), ('people-arrows', 'people-arrows-left-right'), ('people-carry', 'people-carry-box'), ('percentage', 'percent'), ('person-carry', 'person-carry-box'), ('phone-alt', 'phone-flip'), ('phone-laptop', 'laptop-mobile'), ('phone-square', 'square-phone'), ('phone-square-alt', 'square-phone-flip'), ('photo-video', 'photo-film'), ('plane-alt', 'plane-engines'), ('play-circle', 'circle-play'), ('plus-circle', 'circle-plus'), ('plus-hexagon', 'hexagon-plus'), ('plus-octagon', 'octagon-plus'), ('plus-square', 'square-plus'), ('poll', 'square-poll-vertical'), ('poll-h', 'square-poll-horizontal'), ('portal-enter', 'person-to-portal'), ('portal-exit', 'person-from-portal'), ('portrait', 'image-portrait'), ('pound-sign', 'sterling-sign'), ('pray', 'person-praying'), ('praying-hands', 'hands-praying'), ('prescription-bottle-alt', 'prescription-bottle-medical'), ('presentation', 'presentation-screen'), ('print-search', 'print-magnifying-glass'), ('procedures', 'bed-pulse'), ('project-diagram', 'diagram-project'), ('question-circle', 'circle-question'), ('question-square', 'square-question'), ('quran', 'book-quran'), ('rabbit-fast', 'rabbit-running'), ('radiation-alt', 'circle-radiation'), ('radio-alt', 'radio-tuner'), ('random', 'shuffle'), ('rectangle-landscape', 'rectangle'), ('rectangle-portrait', 'rectangle-vertical'), ('redo', 'arrow-rotate-right'), ('redo-alt', 'rotate-right'), ('remove-format', 'text-slash'), ('repeat-1-alt', 'arrows-repeat-1'), ('repeat-alt', 'arrows-repeat'), ('retweet-alt', 'arrows-retweet'), ('rss-square', 'square-rss'), ('running', 'person-running'), ('sad-cry', 'face-sad-cry'), ('sad-tear', 'face-sad-tear'), ('save', 'floppy-disk'), ('sax-hot', 'saxophone-fire'), ('scalpel-path', 'scalpel-line-dashed'), ('scanner-image', 'scanner'), ('search', 'magnifying-glass'), ('search-dollar', 'magnifying-glass-dollar'), ('search-location', 'magnifying-glass-location'), ('search-minus', 'magnifying-glass-minus'), ('search-plus', 'magnifying-glass-plus'), ('sensor-alert', 'sensor-triangle-exclamation'), ('sensor-smoke', 'sensor-cloud'), ('share-alt', 'share-nodes'), ('share-alt-square', 'square-share-nodes'), ('share-square', 'share-from-square'), ('shield-alt', 'shield-halved'), ('shipping-fast', 'truck-fast'), ('shipping-timed', 'truck-clock'), ('shopping-bag', 'bag-shopping'), ('shopping-basket', 'basket-shopping'), ('shopping-cart', 'cart-shopping'), ('shuttle-van', 'van-shuttle'), ('sign', 'sign-hanging'), ('sign-in', 'arrow-right-to-bracket'), ('sign-in-alt', 'right-to-bracket'), ('sign-language', 'hands'), ('sign-out', 'arrow-right-from-bracket'), ('sign-out-alt', 'right-from-bracket'), ('signal-1', 'signal-weak'), ('signal-2', 'signal-fair'), ('signal-3', 'signal-good'), ('signal-4', 'signal-strong'), ('signal-alt', 'signal-bars'), ('signal-alt-1', 'signal-bars-weak'), ('signal-alt-2', 'signal-bars-fair'), ('signal-alt-3', 'signal-bars-good'), ('signal-alt-slash', 'signal-bars-slash'), ('skating', 'person-skating'), ('ski-jump', 'person-ski-jumping'), ('ski-lift', 'person-ski-lift'), ('skiing', 'person-skiing'), ('skiing-nordic', 'person-skiing-nordic'), ('slack-hash', 'slack'), ('sledding', 'person-sledding'), ('sliders-h', 'sliders'), ('sliders-h-square', 'square-sliders'), ('sliders-v', 'sliders-up'), ('sliders-v-square', 'square-sliders-vertical'), ('smile', 'face-smile'), ('smile-beam', 'face-smile-beam'), ('smile-plus', 'face-smile-plus'), ('smile-wink', 'face-smile-wink'), ('smoking-ban', 'ban-smoking'), ('sms', 'comment-sms'), ('snapchat-ghost', 'snapchat'), ('snowboarding', 'person-snowboarding'), 


('snowboarding', 'person-snowboarding'), ('snowmobile', 'person-snowmobiling'), ('sort-alpha-down', 'arrow-down-a-z'), ('sort-alpha-down-alt', 'arrow-down-z-a'), ('sort-alpha-up', 'arrow-up-a-z'), ('sort-alpha-up-alt', 'arrow-up-z-a'), ('sort-alt', 'arrow-down-arrow-up'), ('sort-amount-down', 'arrow-down-wide-short'), ('sort-amount-down-alt', 'arrow-down-short-wide'), ('sort-amount-up', 'arrow-up-wide-short'), ('sort-amount-up-alt', 'arrow-up-short-wide'), ('sort-circle', 'circle-sort'), ('sort-circle-down', 'circle-sort-down'), ('sort-circle-up', 'circle-sort-up'), ('sort-numeric-down', 'arrow-down-1-9'), ('sort-numeric-down-alt', 'arrow-down-9-1'), ('sort-numeric-up', 'arrow-up-1-9'), ('sort-numeric-up-alt', 'arrow-up-9-1'), ('sort-shapes-down', 'arrow-down-triangle-square'), ('sort-shapes-down-alt', 'arrow-down-square-triangle'), ('sort-shapes-up', 'arrow-up-triangle-square'), ('sort-shapes-up-alt', 'arrow-up-square-triangle'), ('sort-size-down', 'arrow-down-big-small'), ('sort-size-down-alt', 'arrow-down-small-big'), ('sort-size-up', 'arrow-up-big-small'), ('sort-size-up-alt', 'arrow-up-small-big'), ('soup', 'bowl-hot'), ('space-shuttle', 'shuttle-space'), ('space-station-moon-alt', 'space-station-moon-construction'), ('square-root-alt', 'square-root-variable'), ('star-half-alt', 'star-half-stroke'), ('starfighter-alt', 'starfighter-twin-ion-engine'), ('step-backward', 'backward-step'), ('step-forward', 'forward-step'), ('sticky-note', 'note-sticky'), ('stop-circle', 'circle-stop'), ('store-alt', 'shop'), ('store-alt-slash', 'shop-slash'), ('stream', 'bars-staggered'), ('subway', 'train-subway'), ('surprise', 'face-surprise'), ('swimmer', 'person-swimming'), ('swimming-pool', 'water-ladder'), ('sync', 'arrows-rotate'), ('sync-alt', 'rotate'), ('table-tennis', 'table-tennis-paddle-ball'), ('tablet-alt', 'tablet-screen-button'), ('tablet-android', 'tablet'), ('tablet-android-alt', 'tablet-screen'), ('tachometer', 'gauge-simple'), ('tachometer-alt', 'gauge'), ('tachometer-alt-average', 'gauge-med'), ('tachometer-alt-fast', 'gauge'), ('tachometer-alt-fastest', 'gauge-max'), ('tachometer-alt-slow', 'gauge-low'), ('tachometer-alt-slowest', 'gauge-min'), ('tachometer-average', 'gauge-simple-med'), ('tachometer-fast', 'gauge-simple'), ('tachometer-fastest', 'gauge-simple-max'), ('tachometer-slow', 'gauge-simple-low'), ('tachometer-slowest', 'gauge-simple-min'), ('tanakh', 'book-tanakh'), ('tasks', 'list-check'), ('tasks-alt', 'bars-progress'), ('telegram-plane', 'telegram'), ('temperature-down', 'temperature-arrow-down'), ('temperature-frigid', 'temperature-snow'), ('temperature-hot', 'temperature-sun'), ('temperature-up', 'temperature-arrow-up'), ('tenge', 'tenge-sign'), ('th', 'table-cells'), ('th-large', 'table-cells-large'), ('th-list', 'table-list'), ('theater-masks', 'masks-theater'), ('thermometer-empty', 'temperature-empty'), ('thermometer-full', 'temperature-full'), ('thermometer-half', 'temperature-half'), ('thermometer-quarter', 'temperature-quarter'), ('thermometer-three-quarters', 'temperature-three-quarters'), ('thumb-tack', 'thumbtack'), ('thunderstorm', 'cloud-bolt'), ('thunderstorm-moon', 'cloud-bolt-moon'), ('thunderstorm-sun', 'cloud-bolt-sun'), ('ticket-alt', 'ticket-simple'), ('times', 'xmark'), ('times-circle', 'circle-xmark'), ('times-hexagon', 'hexagon-xmark'), ('times-octagon', 'octagon-xmark'), ('times-square', 'square-xmark'), ('tint', 'droplet'), ('tint-slash', 'droplet-slash'), ('tired', 'face-tired'), ('toilet-paper-alt', 'toilet-paper-blank'), ('tombstone-alt', 'tombstone-blank'), ('tools', 'screwdriver-wrench'), ('torah', 'scroll-torah'), ('tram', 'train-tram'), ('transgender-alt', 'transgender'), ('trash-alt', 'trash-can'), ('trash-restore', 'trash-arrow-up'), ('trash-restore-alt', 'trash-can-arrow-up'), ('trash-undo-alt', 'trash-can-undo'), ('tree-alt', 'tree-deciduous'), ('triangle-music', 'triangle-instrument'), ('trophy-alt', 'trophy-star'), ('truck-couch', 'truck-ramp-couch'), ('truck-loading', 'truck-ramp-box'), ('tshirt', 'shirt'), ('tv-alt', 'tv'), ('undo', 'arrow-rotate-left'), ('undo-alt', 'rotate-left'), ('university', 'building-columns'), ('unlink', 'link-slash'), ('unlock-alt', 'unlock-keyhole'), ('usd-circle', 'circle-dollar'), ('usd-square', 'square-dollar'), ('user-alt', 'user-large'), ('user-alt-slash', 'user-large-slash'), ('user-chart', 'chart-user'), ('user-circle', 'circle-user'), ('user-cog', 'user-gear'), ('user-edit', 'user-pen'), ('user-friends', 'user-group'), ('user-hard-hat', 'user-helmet-safety'), ('user-md', 'user-doctor'), ('user-md-chat', 'user-doctor-message'), ('user-times', 'user-xmark'), ('users-class', 'screen-users'), ('users-cog', 'users-gear'), ('users-crown', 'user-group-crown'), ('utensil-fork', 'fork'), ('utensil-knife', 'knife'), ('utensil-spoon', 'spoon'), ('utensils-alt', 'fork-knife'), ('vhs', 'cassette-vhs'), ('volleyball-ball', 'volleyball'), ('volume-down', 'volume-low'), ('volume-mute', 'volume-xmark'), ('volume-up', 'volume-high'), ('vote-nay', 'xmark-to-slot'), ('vote-yea', 'check-to-slot'), ('walking', 'person-walking'), ('warehouse-alt', 'warehouse-full'), ('washer', 'washing-machine'), ('water-lower', 'water-arrow-down'), ('water-rise', 'water-arrow-up'), ('waveform-path', 'waveform-lines'), ('webcam', 'camera-web'), ('webcam-slash', 'camera-web-slash'), ('weight', 'weight-scale'), ('wifi-1', 'wifi-weak'), ('wifi-2', 'wifi-fair'), ('window-alt', 'window-flip'), ('window-close', 'rectangle-xmark'), ('wine-glass-alt', 'wine-glass-empty')) AS mapping(from_icon, to_icon)\n)\nUPDATE directory_columns\nSET icon =\n  CASE\n    WHEN icon LIKE 'fab-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far-%' THEN CONCAT('far-', remaps.to_icon)\n    WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', remaps.to_icon)\n    WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', remaps.to_icon)\n    ELSE remaps.to_icon\n  END\nFROM remaps\nWHERE icon = remaps.from_icon\n  OR icon = CONCAT('fa-', remaps.from_icon)\n  OR icon = CONCAT('far-', remaps.from_icon)\n  OR icon = CONCAT('fab-', remaps.from_icon)\n  OR icon = CONCAT('far fa-', remaps.from_icon)\n  OR icon = CONCAT('fab fa-', remaps.from_icon)\n  OR icon = CONCAT('fas fa-', remaps.from_icon);\n")
   -> 0.0055s
-- execute("UPDATE directory_columns\nSET icon =\nCASE\n  WHEN icon LIKE 'fas fa-%' THEN SUBSTRING(icon FROM 8)\n  WHEN icon LIKE 'far fa-%' THEN CONCAT('far-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fab fa-%' THEN CONCAT('fab-', SUBSTRING(icon FROM 8))\n  WHEN icon LIKE 'fa-%' THEN SUBSTRING(icon FROM 4)\n  ELSE icon\nEND\nWHERE icon LIKE 'fa-%'\n  OR icon LIKE 'far fa-%'\n  OR icon LIKE 'fab fa-%'\n  OR icon LIKE 'fas fa-%';\n")
   -> 0.0003s
== 20241204085540 RemapToFa6IconNames: migrated (0.0600s) =====================

== 20241205035402 ChangeDefaultForBadgesIcon: migrating =======================
-- change_column_default(:badges, :icon, {:from=>"fa-certificate", :to=>"certificate"})
   -> 0.0023s
-- execute("UPDATE badges\nSET icon = 'certificate'\nWHERE icon = 'fa-certificate';\n")
   -> 0.0003s
== 20241205035402 ChangeDefaultForBadgesIcon: migrated (0.0032s) ==============

== 20241205162117 AddColumnsToMovedPosts: migrating ===========================
-- add_column(:moved_posts, :old_topic_title, :string)
   -> 0.0010s
-- add_column(:moved_posts, :post_user_id, :integer)
   -> 0.0003s
-- add_column(:moved_posts, :user_id, :integer)
   -> 0.0002s
-- add_index(:moved_posts, [:new_topic_id, :post_user_id])
   -> 0.0031s
== 20241205162117 AddColumnsToMovedPosts: migrated (0.0052s) ==================

== 20241206002425 DropExperimentalTopicsFilterSiteSetting: migrating ==========
-- execute("DELETE FROM site_settings\nWHERE name = 'experimental_topics_filter'\n")
   -> 0.0002s
== 20241206002425 DropExperimentalTopicsFilterSiteSetting: migrated (0.0006s) =

== 20241206121401 DeleteCategoriesOnlyOptimizedSiteSetting: migrating =========
-- execute("DELETE FROM site_settings WHERE name = 'desktop_category_page_style' AND value = 'categories_only_optimized'")
   -> 0.0002s
== 20241206121401 DeleteCategoriesOnlyOptimizedSiteSetting: migrated (0.0005s) 

== 20241211030039 RemoveGlimmerPostMenuGroupsSetting: migrating ===============
-- execute("DELETE FROM site_settings\nWHERE name = 'glimmer_post_menu_groups'\n")
   -> 0.0002s
== 20241211030039 RemoveGlimmerPostMenuGroupsSetting: migrated (0.0005s) ======

== 20241211222608 AddFullMoveToMovedPostRecords: migrating ====================
-- add_column(:moved_posts, :full_move, :boolean)
   -> 0.0003s
== 20241211222608 AddFullMoveToMovedPostRecords: migrated (0.0007s) ===========

== 20241224191732 ChangeFullNameRequiredSetting: migrating ====================
== 20241224191732 ChangeFullNameRequiredSetting: migrated (0.0012s) ===========

== 20241226162229 AddChatSendShortcutPreference: migrating ====================
-- add_column(:user_options, :chat_send_shortcut, :integer, {:default=>0, :null=>false})
   -> 0.0007s
== 20241226162229 AddChatSendShortcutPreference: migrated (0.0011s) ===========

== 20250115031117 RemoveUserProfileFromOverriddenRobots: migrating ============
-- select_value("SELECT value FROM site_settings WHERE name = 'overridden_robots_txt' AND value LIKE '%User-agent: *\nDisallow: /admin/\nDisallow: /auth/\nDisallow: /assets/browser-update*.js\nDisallow: /email/\nDisallow: /session\nDisallow: /user-api-key\nDisallow: /*?api_key*\nDisallow: /*?*api_key*\nDisallow: /badges\nDisallow: /u/%'")
   -> 0.0002s
== 20250115031117 RemoveUserProfileFromOverriddenRobots: migrated (0.0006s) ===

== 20250116024516 UpdateFontSiteSettingsType: migrating =======================
-- execute("UPDATE site_settings SET data_type=8 WHERE name IN('base_font', 'heading_font')")
   -> 0.0002s
== 20250116024516 UpdateFontSiteSettingsType: migrated (0.0005s) ==============

== 20250117065027 SetDefaultFontForExistingSites: migrating ===================
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('base_font', 8, 'arial', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0002s
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('heading_font', 8, 'arial', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0002s
== 20250117065027 SetDefaultFontForExistingSites: migrated (0.0029s) ==========

== 20250119222805 FillFastTypingThresholdBasedOnDeprecatedSetting: migrating ==
== 20250119222805 FillFastTypingThresholdBasedOnDeprecatedSetting: migrated (0.0005s) 

== 20250120115539 AddDarkHexToColorSchemeColor: migrating =====================
-- add_column(:color_scheme_colors, :dark_hex, :string, {:limit=>6})
   -> 0.0004s
== 20250120115539 AddDarkHexToColorSchemeColor: migrated (0.0007s) ============

== 20250121180125 CreateThemeColorScheme: migrating ===========================
-- create_table(:theme_color_schemes)
   -> 0.0039s
-- add_index(:theme_color_schemes, :theme_id, {:unique=>true})
   -> 0.0027s
-- add_index(:theme_color_schemes, :color_scheme_id, {:unique=>true})
   -> 0.0029s
== 20250121180125 CreateThemeColorScheme: migrated (0.0100s) ==================

== 20250124062108 RemapDeprecatedIconNamesForSeededBadges: migrating ==========
-- execute("WITH remaps AS (\n  SELECT from_icon, to_icon\n  FROM (VALUES ('smile', 'face-smile'), ('share-alt', 'share-nodes'))\n  AS mapping(from_icon, to_icon)\n)\nUPDATE badges\nSET icon = remaps.to_icon\nFROM remaps\nWHERE icon = remaps.from_icon;\n")
   -> 0.0005s
== 20250124062108 RemapDeprecatedIconNamesForSeededBadges: migrated (0.0009s) =

== 20250130205841 FixIncorrectFastTypingThresholdSetting: migrating ===========
-- execute("UPDATE site_settings SET value = 'disabled' WHERE name = 'fast_typing_threshold' AND value = 'off'")
   -> 0.0002s
== 20250130205841 FixIncorrectFastTypingThresholdSetting: migrated (0.0005s) ==

== 20250205174221 AddSerializeTopicOpLikesDataThemeModifier: migrating ========
-- add_column(:theme_modifier_sets, :serialize_topic_op_likes_data, :boolean, {:null=>true})
   -> 0.0004s
== 20250205174221 AddSerializeTopicOpLikesDataThemeModifier: migrated (0.0007s) 

== 20250212044021 RenameAllowAllUsersToFlagIllegalContentSiteSetting: migrating 
-- execute("UPDATE site_settings SET name = 'allow_all_users_to_flag_illegal_content' where name = 'allow_tl0_and_anonymous_users_to_flag_illegal_content'")
   -> 0.0002s
== 20250212044021 RenameAllowAllUsersToFlagIllegalContentSiteSetting: migrated (0.0005s) 

== 20250212045125 AddTypeSourceToReviewable: migrating ========================
-- add_column(:reviewables, :type_source, :string, {:null=>false, :default=>"unknown"})
   -> 0.0006s
== 20250212045125 AddTypeSourceToReviewable: migrated (0.0023s) ===============

== 20250217003916 XSummaryLargeImageBasedOnDeprecatedSetting: migrating =======
== 20250217003916 XSummaryLargeImageBasedOnDeprecatedSetting: migrated (0.0007s) 

== 20250220045740 AddContextToReviewableScores: migrating =====================
-- add_column(:reviewable_scores, :context, :string)
   -> 0.0004s
== 20250220045740 AddContextToReviewableScores: migrated (0.0007s) ============

== 20250220090521 AddLastUnreadMessageWhenEmailedIdToChatThreadMemberships: migrating 
-- add_column(:user_chat_thread_memberships, :last_unread_message_when_emailed_id, :bigint)
   -> 0.0003s
== 20250220090521 AddLastUnreadMessageWhenEmailedIdToChatThreadMemberships: migrated (0.0006s) 

== 20250227142351 MigrateSidekiqJobs: migrating ===============================
== 20250227142351 MigrateSidekiqJobs: migrated (0.0025s) ======================

== 20250304034313 AddComposerColumnsToPostStat: migrating =====================
-- add_column(:post_stats, :composer_version, :integer)
   -> 0.0004s
-- add_column(:post_stats, :writing_device, :string)
   -> 0.0032s
-- add_column(:post_stats, :writing_device_user_agent, :string)
   -> 0.0003s
== 20250304034313 AddComposerColumnsToPostStat: migrated (0.0044s) ============

== 20250304054720 AddScopeModeToApiKeys: migrating ============================
-- add_column(:api_keys, :scope_mode, :integer, {:null=>true})
   -> 0.0004s
== 20250304054720 AddScopeModeToApiKeys: migrated (0.0007s) ===================

== 20250304074934 BackfillApiKeyScopeModes: migrating =========================
== 20250304074934 BackfillApiKeyScopeModes: migrated (0.0010s) ================

== 20250305233449 PopulateTypeSourceInReviewable: migrating ===================
== 20250305233449 PopulateTypeSourceInReviewable: migrated (0.0020s) ==========

== 20250307031538 MigrateCategoryToCategoriesPostCreated: migrating ===========
-- execute("DELETE FROM discourse_automation_fields\nWHERE name = 'restricted_categories'\n  AND target = 'trigger'\n  AND automation_id IN (\n    SELECT id FROM discourse_automation_automations\n    WHERE trigger = 'post_created_edited'\n  )\n")
   -> 0.0004s
-- execute("INSERT INTO discourse_automation_fields (\n  automation_id, component, name, target, metadata, created_at, updated_at\n)\nSELECT\n  f.automation_id,\n  'categories' as component,\n  'restricted_categories' as name,\n  f.target,\n  jsonb_build_object('value', ARRAY[CAST(f.metadata->>'value' AS INTEGER)]) as metadata,\n  NOW() as created_at,\n  NOW() as updated_at\nFROM discourse_automation_fields f\nJOIN discourse_automation_automations a ON a.id = f.automation_id\nWHERE f.component = 'category'\nAND f.name = 'restricted_category'\nAND f.target = 'trigger'\nAND f.metadata->>'value' IS NOT NULL\nAND a.trigger = 'post_created_edited'\n")
   -> 0.0003s
== 20250307031538 MigrateCategoryToCategoriesPostCreated: migrated (0.0011s) ==

== 20250307034117 RemoveOldAdminSidebarEnabledGroupsSiteSettings: migrating ===
-- execute("DELETE FROM site_settings WHERE name = 'admin_sidebar_enabled_groups'")
   -> 0.0002s
== 20250307034117 RemoveOldAdminSidebarEnabledGroupsSiteSettings: migrated (0.0006s) 

== 20250311041851 AddIndexToPostStatComposerColumns: migrating ================
-- remove_index(:post_stats, :composer_version, {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0014s
-- remove_index(:post_stats, :writing_device, {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0011s
-- add_index(:post_stats, :composer_version, {:algorithm=>:concurrently})
   -> 0.0032s
-- add_index(:post_stats, :writing_device, {:algorithm=>:concurrently})
   -> 0.0028s
== 20250311041851 AddIndexToPostStatComposerColumns: migrated (0.0091s) =======

== 20250311073009 EnableWelcomeBannerNewSites: migrating ======================
-- execute("INSERT INTO site_settings(name, data_type, value, created_at, updated_at)\nVALUES('enable_welcome_banner', 5, 'f', NOW(), NOW())\nON CONFLICT (name) DO NOTHING\n")
   -> 0.0003s
== 20250311073009 EnableWelcomeBannerNewSites: migrated (0.0012s) =============

== 20250313044812 RemoveUniqueConstraintFromTagUsersIndexes: migrating ========
-- remove_index(:tag_users, {:name=>:idx_tag_users_ix1, :algorithm=>:concurrently, :if_exists=>true})
   -> 0.0079s
-- remove_index(:tag_users, {:name=>:idx_tag_users_ix2, :algorithm=>:concurrently, :if_exists=>true})
   -> 0.0074s
-- remove_index(:tag_users, [:user_id, :tag_id, :notification_level], {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0014s
-- remove_index(:tag_users, [:tag_id, :user_id, :notification_level], {:algorithm=>:concurrently, :if_exists=>true})
   -> 0.0011s
-- add_index(:tag_users, [:user_id, :tag_id, :notification_level], {:algorithm=>:concurrently})
   -> 0.0028s
-- add_index(:tag_users, [:tag_id, :user_id, :notification_level], {:algorithm=>:concurrently})
   -> 0.0028s
== 20250313044812 RemoveUniqueConstraintFromTagUsersIndexes: migrated (0.0242s) 

== 20250313045010 AddIndexToUsersIpAddress: migrating =========================
-- remove_index(:users, :ip_address, {:algorithm=>:concurrently, :name=>"idx_users_ip_address", :if_exists=>true})
   -> 0.0032s
-- add_index(:users, :ip_address, {:algorithm=>:concurrently, :name=>"idx_users_ip_address"})
   -> 0.0034s
== 20250313045010 AddIndexToUsersIpAddress: migrated (0.0073s) ================


[2025-03-19 02:09:40] إعادة الاتصال بقاعدة البيانات...
[2025-03-19 02:09:40] إعادة تحميل إعدادات الموقع...
[2025-03-19 02:09:40] تعطيل البريد الإلكتروني الصادر للمستخدمين غير الموظفين...
[2025-03-19 02:09:40] تعطيل وضع القراءة فقط...
[2025-03-19 02:09:40] مسح ذاكرة التخزين المؤقت للفئات...
[2025-03-19 02:09:40] إعادة تحميل الترجمات...
[2025-03-19 02:09:40] إعادة تعيين تعيينات الملفات المرفوعة...
[2025-03-19 02:09:40] استعادة الملفات المرفوعة، قد يستغرق هذا بعض الوقت...
[2025-03-19 02:10:00] استثناء: لم يتم إعادة تعيين 1 منشور إلى عنوان URL الجديد لرفع S3. فشلت هجرة S3 لقاعدة البيانات 'default'.
[2025-03-19 02:10:00] /var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:81:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:383:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:354:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:167:in `restore_uploads'
/var/www/discourse/lib/backup_restore/restorer.rb:71:in `run'
/var/www/discourse/script/spawn_backup_restore.rb:20:in `restore'
/var/www/discourse/script/spawn_backup_restore.rb:33:in `block in <main>'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `<main>'
[2025-03-19 02:10:00] محاولة التراجع...
[2025-03-19 02:10:00] جاري التراجع...
[2025-03-19 02:10:00] تنظيف الأشياء...
[2025-03-19 02:10:00] إسقاط الدوال من مخطط discourse_functions...
[2025-03-19 02:10:00] إزالة المجلد المؤقت '/var/www/discourse/tmp/restores/default/2025-03-19-020905'...
[2025-03-19 02:10:00] إعادة تشغيل Sidekiq...
[2025-03-19 02:10:00] وضع علامة على أن الاستعادة قد انتهت...
[2025-03-19 02:10:00] إشعار 'المسؤول' بنهاية الاستعادة...

أعتقد أن هذا كل شيء، وأعتذر عن نشر الكثير من المعلومات.```

أعتقد أن هذا هو السطر المهم. لا أرى أي معلومات داعمة مفيدة بالقرب منه، لذا على الرغم من أن الإجابة قد تكون تعديلاً بسيطًا لقاعدة بياناتك، إلا أنني لا أعرف كيف ستكتشف أي مشاركة فشلت في إعادة التعيين.

هل هناك طريقة لترحيل قاعدة البيانات فقط؟ أو هل يمكنني إعادة تعيين الصور الموجودة في S3 بدون استعادة؟

[اقتباس=“مستخدم يعاني من مشكلة، منشور:4، موضوع:357885”]
:10:00] استثناء: لم يتم إعادة تعيين منشور واحد إلى عنوان تحميل S3 الجديد. فشل ترحيل S3 لقواعد البيانات 'default
[/اقتباس]

هذه هي المشكلة. عليك أن تجد التحميل الذي ليس على S3، أعتقد.

يبدو هذا مثل المشكلة المذكورة في Can't restore a backup if it includes link to Discourse onebox :وجه_قلق:
يجب أن تكون قادرًا على إصلاح هذا أثناء الاستعادة، ولكن تحتاج إلى القيام بذلك عبر سطر الأوامر.

cd /var/discourse
./launcher enter app

# ابدأ الاستعادة مع الوسيطة --pause
discourse restore --pause <backup_filename>

سيؤدي هذا إلى إيقاف عملية الاستعادة في نقطتين:

  1. قبل تشغيل ترحيلات قاعدة البيانات – يمكنك تجاهل ذلك؛ اضغط على مفتاح للمتابعة
  2. قبل استعادة الملفات. سيكون لديك حق الوصول إلى جدول uploads غير المعدل (لم يتم تشغيل أي إعادة تعيين بعد) مما يسمح لك بإصلاح الملفات قبل أن تفشل عملية الاستعادة بسببها.

الآن، افتح جلسة SSH أخرى إلى الخادم الخاص بك وابدأ وحدة تحكم rails:

cd /var/discourse
./launcher enter app

rails c

ستحتاج إلى معرفة أي Post يسبب فشل الاستعادة. إذا كنت محظوظًا، ستجده عن طريق تنفيذ ما يلي في وحدة تحكم rails:

current_db = RailsMultisite::ConnectionManagement.current_db
cdn_path = SiteSetting.cdn_path("/uploads/#{current_db}/original").sub(/https?:/, "")
Post.where("cooked LIKE '%#{cdn_path}%'")

لم أكن أعرف عن هذا!

لذلك بدا أن هذا يعثر على بعض المشاركات ولكنني لست متأكدًا من كيفية حذفها أو إصلاحها قبل إكمال استعادة التحميلات.

[#<Post:0x0000fbe1dfc5bbe8
 id: 210,
 user_id: 1,
 topic_id: 76,
 post_number: 1,
 raw: "[poll type=multiple results=always min=1 max=2 cha...",
 cooked: "<div class=\"poll\" data-poll-status=\"open\" data-pol...",
 created_at: "2020-01-02 19:41:05.980378000 +0000",
 updated_at: "2020-01-04 01:18:37.573545000 +0000",
 reply_to_post_number: nil,
 reply_count: 0,
 quote_count: 0,
 deleted_at: nil,
 off_topic_count: 0,
 like_count: 0,
 incoming_link_count: 2,
 bookmark_count: 0,
 score: 13.0,
 reads: 15,
 post_type: 1,
 sort_order: 1,
 last_editor_id: 1,
 hidden: false,
 hidden_reason_id: nil,
 notify_moderators_count: 0,
 spam_count: 0,
 illegal_count: 0,
 inappropriate_count: 0,
 last_version_at: "2020-01-02 19:47:03.890656000 +0000",
 user_deleted: false,
 reply_to_user_id: nil,
 percent_rank: 0.1111111111111111,
 notify_user_count: 0,
 like_score: 0,
 deleted_by_id: nil,
 edit_reason: nil,
 word_count: 30,
 version: 2,
 cook_method: 1,
 wiki: false,
 baked_at: "2020-01-24 18:29:52.371387000 +0000",
 baked_version: 2,
 hidden_at: nil,
 self_edits: 1,
 reply_quoted: false,
 via_email: false,
 raw_email: nil,
Preparing full inspection value...
=>
[#<Post:0x0000fbe1dfc5bbe8
 id: 210,
 user_id: 1,
 topic_id: 76,
 post_number: 1,
 raw: "[poll type=multiple results=always min=1 max=2 cha...",
 cooked: "<div class=\"poll\" data-poll-status=\"open\" data-pol...",
 created_at: "2020-01-02 19:41:05.980378000 +0000",
 updated_at: "2020-01-04 01:18:37.573545000 +0000",
 reply_to_post_number: nil,
 reply_count: 0,
 quote_count: 0,
 deleted_at: nil,
 off_topic_count: 0,
 like_count: 0,
 incoming_link_count: 2,
 bookmark_count: 0,
 score: 13.0,
 reads: 15,
 post_type: 1,
 sort_order: 1,
 last_editor_id: 1,
 hidden: false,
 hidden_reason_id: nil,
 notify_moderators_count: 0,
 spam_count: 0,
 illegal_count: 0,
 inappropriate_count: 0,
 last_version_at: "2020-01-02 19:47:03.890656000 +0000",
 user_deleted: false,
 reply_to_user_id: nil,
 percent_rank: 0.1111111111111111,
 notify_user_count: 0,
 like_score: 0,
 deleted_by_id: nil,
 edit_reason: nil,
 word_count: 30,
 version: 2,
 cook_method: 1,
 wiki: false,
 baked_at: "2020-01-24 18:29:52.371387000 +0000",
 baked_version: 2,
 hidden_at: nil,
 self_edits: 1,
 reply_quoted: false,
 via_email: false,
 raw_email: nil,
 public_version: 2,
:...skipping...
=>
[#<Post:0x0000fbe1dfc5bbe8
 id: 210,
 user_id: 1,
 topic_id: 76,
 post_number: 1,
 raw: "[poll type=multiple results=always min=1 max=2 cha...",
 cooked: "<div class=\"poll\" data-poll-status=\"open\" data-pol...",
 created_at: "2020-01-02 19:41:05.980378000 +0000",
 updated_at: "2020-01-04 01:18:37.573545000 +0000",
 reply_to_post_number: nil,
 reply_count: 0,
 quote_count: 0,
 deleted_at: nil,
 off_topic_count: 0,
 like_count: 0,
 incoming_link_count: 2,
 bookmark_count: 0,
 score: 13.0,
 reads: 15,
 post_type: 1,
 sort_order: 1,
 last_editor_id: 1,
 hidden: false,
 hidden_reason_id: nil,
 notify_moderators_count: 0,
 spam_count: 0,
 illegal_count: 0,
 inappropriate_count: 0,
 last_version_at: "2020-01-02 19:47:03.890656000 +0000",
 user_deleted: false,
 reply_to_user_id: nil,
 percent_rank: 0.1111111111111111,
 notify_user_count: 0,
 like_score: 0,
 deleted_by_id: nil,
 edit_reason: nil,
 word_count: 30,
 version: 2,
 cook_method: 1,
 wiki: false,
 baked_at: "2020-01-24 18:29:52.371387000 +0000",
 baked_version: 2,
 hidden_at: nil,
 self_edits: 1,
 reply_quoted: false,
 via_email: false,
 raw_email: nil,
 public_version: 2,
 action_code: nil,
 locked_by_id: nil,
 image_upload_id: 50,
 outbound_message_id: nil>,
#<Post:0x0000fbe1dfbf74e0
 id: 296,
 user_id: 17,
 topic_id: 102,
 post_number: 1,
 raw: "Hello everybody!\n I would like to try to debate th...",
 cooked: "<p>Hello everybody!<br>\nI would like to try to deb...",
 created_at: "2020-01-19 18:20:12.690712000 +0000",
 updated_at: "2021-01-16 01:26:03.982006000 +0000",
 reply_to_post_number: nil,
 reply_count: 0,
 quote_count: 0,
 deleted_at: nil,
 off_topic_count: 0,
 like_count: 0,
 incoming_link_count: 2,
 bookmark_count: 0,
 score: 12.4,
 reads: 12,
:

لقد نجحت في تشغيله. شكراً للجميع على المساعدة!